2017-04-12 3 views
0

J'essaie de configurer un écouteur mllp pour les messages hl7v2.x en utilisant camel.Comment générer un accusé de réception personnalisé avec apache camel hl7

Mon environnement

  • chameau apache et la version des composants 2.18.3

Aussi je voudrais éviter l'utilisation de la bibliothèque HAPI, comme je préfère un analyseur personnalisé pour la réception et généré messages. Comme mes clients utilisent chacun des versions différentes de l'utilisation des champs standard et vraiment différents. C'est pourquoi il n'y a pas de confusion au type de données hl7 dans la route suivante, juste pour la chaîne. Je vais faire l'analyseur moi-même.

Et ma route (tous les haricots et les variables sont définies ailleurs dans le code, je pense qu'ils ne sont pas pertinents)

from("netty4:tcp://0.0.0.0:3333? 
encoder=#encoderHl7&decoder=#decoderHl7&sync=true") 
.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") 
.unmarshal().string() 
.to("file://" + rutaSalidaFichero) 
; 

Tout d'abord, comme prouver concept, je suis juste en train de copier tous les les messages reçus dans un répertoire du système de fichiers. Les messages sont correctement reçus et écrits dans le répertoire. Mais je ne sais pas comment générer et envoyer le ACK, un incorrect est automatiquement généré et envoyé.

Si j'envoie un message hl7 d'un système externe/expéditeur, le composant camel envoie le même message que l'accusé de réception, de sorte que le système expéditeur envoie une erreur en retour car ce n'est pas l'accusé de réception. J'envoie le message hl7 en utilisant mirth, dcm4chee, hapi ... le tout avec le même résultat.

Par exemple, si j'envoie le message suivant à partir d'un système extérieur/émetteur MSH |^~ \ & | LIS | LIS | HIS | HIS | 20170412131105 || OML^O21 | 0000000001 | P | 2.5 ||| AL ||| ||| 8859/1 1,0 PID | 1 || || 123456 & APELLIDO1 APELLIDO2^NOMBRE | 19200101 ORC | RP | 009509452919 | 317018426 20170412000000 |||||| OBR | 1 | 317018426 | 317018426 | CULT^CULTIVO

J'ai reçu le même que l'accusé de réception dans le système d'envoi. Ceci est le chameau générant l'accusé de réception comme message de réception MSH |^~ \ & | LIS | LIS | HIS | HIS | 20170412131105 || OML^O21 | 0000000001 | P | 2.5 ||| AL ||| 8859/1 | 1,0 || PID | 1 || || 123456 & APELLIDO1 APELLIDO2^NOMBRE | 19200101 ORC | RP | 009509452919 | 317018426 20170412000000 |||||| OBR | 1 | 317018426 | 317018426 | CULT^CULTIVO

Je n'ai pas trouvé dans les références de camel docs à la génération de l'ack, ou si je peux utiliser un "quelque chose" personnalisé pour le générer. Je voudrais changer ce comportement par défaut.

Répondre

0

comme composant chameau HL7 docs dit (http://camel.apache.org/hl7.html, "HL7 expression Acquittement") vous pouvez générer ack par défaut en utilisant simplement

import static org.apache.camel.component.hl7.HL7.ack; 
... 

    from("direct:test1") 
     // acknowledgement 
     .transform(ack()) 

ici "ack()" est un appel à « org.apache.camel .component.hl7.HL7 # ack() ". Mais vous pouvez vérifier que « org.apache.camel.component.hl7.HL7 » contient quelques autres méthodes utiles comme

org.apache.camel.component.hl7.HL7#ack(ca.uhn.hl7v2.AcknowledgmentCode code) 

ou

org.apache.camel.component.hl7.HL7#ack(ca.uhn.hl7v2.AcknowledgmentCode code, java.lang.String errorMessage, ca.uhn.hl7v2.ErrorCode) 

Vous pouvez les utiliser pour personnaliser la réponse ACK réelle. Si nous aller plus loin, vous pouvez voir que « org.apache.camel.component.hl7.HL7 # ack » ne sont que des wrappers pour

new ValueBuilder(new AckExpression(...)) 

et la plupart des params de méthodes « ack » vont directement au org.apache.camel.component.hl7.AckExpression. Réelle génération ACK est fait dans « org.apache.camel.component.hl7.AckExpression # évaluer » et ressemble à

public Object evaluate(Exchange exchange) { 
     Throwable t = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class); 
     Message msg = exchange.getIn().getBody(Message.class); 
     try { 
      HL7Exception hl7e = generateHL7Exception(t); 
      AcknowledgmentCode code = acknowledgementCode; 
      if (t != null && code == null) { 
       code = AcknowledgmentCode.AE; 
      } 
      return msg.generateACK(code == null ? AcknowledgmentCode.AA : code, hl7e); 
     } catch (Exception e) { 
      throw ObjectHelper.wrapRuntimeCamelException(e); 
     } 
    } 

Si vous voulez la personnalisation plus vous pouvez simplement écrire votre propre MyCustomAckExpression qui prolongera org.apache. camel.component.hl7.AckExpression et mettre en œuvre la place nécessaire logique de

return msg.generateACK(code == null ? AcknowledgmentCode.AA : code, hl7e); 

et de l'utiliser comme

... 

    from("direct:test1") 
     // acknowledgement 
     .transform(new ValueBuilder(new MyCustomAckExpression())) 
+0

J'ai récrit la route il ressemble maintenant à ceci. de.. ("Netty4: tcp: //0.0.0.0: 3333 = encodeur # encoderHl7 et décodeur = # decoderHl7 & Sync = true") de .unmarshal() string() .onCompletion() modeBeforeConsumer() .transform (ack (AckCode.AA)) .end() .to ("fichier: //" + rutaSalidaFichero); Si je n'utilise pas onCompletion(). ModeBeforeConsumer(), je perds le message d'origine pour le reste de l'itinéraire, et l'accusé de réception est écrit dans le système de fichiers à la place du message d'origine. Les commentaires et suggestions sont vraiment les bienvenus. – usuario

0

C'est ce que je l'ai fait sur mon projet:

<bean id="hl7Processor" class="com.mediresource.MessageRouting.HL7.HL7Processor" /> 

<route> 
    <from uri="mina2:tcp://10.68.124.140:2575?sync=true&amp;codec=#hl7codec" /> 
    <onException> 
     <exception>org.apache.camel.RuntimeCamelException</exception> 
     <exception>ca.uhn.hl7v2.HL7Exception</exception> 
     <redeliveryPolicy maximumRedeliveries="0" /> 
     <handled> 
      <constant>true</constant> 
     </handled>   
     <bean ref="hl7Processor" method="sendACKError" /> 
    </onException>  
    <bean ref="hl7Processor" method="sendACK" /> 
</route> 

Sur classe HL7Processor J'ai ceci:

public Message sendACK(Message message, Exchange exchange) throws HL7Exception, IOException { 

    logger.debug("Entering");  
    Message ack = message.generateACK(); 
    logger.info("(10-4), End - ACK sent for " + exchange.getExchangeId()); 
    return ack; 

} 

public Message sendACKError(Message message, Exception ex) throws HL7Exception, IOException { 

    try { 
     logger.warn("Internal Error:" + ex); 
     Message ack = message.generateACK(AcknowledgmentCode.AE, new HL7Exception("Internal Error")); 
     logger.warn("(10-4), End - NACK"); 
     return ack; 
    } catch (Exception ex1) { 
     logger.error("Fatal error on processError! ", ex1); 
    } 
    return null; 
}