2017-06-05 4 views
0

J'utilise Spring Integration JMS Outbound Adapter pour envoyer un message à IBM MQ et j'ai constaté que certains des en-têtes JMS provenant de l'application en amont sont ignorés ou par défaut. La demande en amont envoie le dessous de têtes JMS,Comment garder les en-têtes JMS provenant des applications en amont?

JMSType:
JMSDeliveryMode:
JMSExpiration:
JMSPriority:
JMSMessageID:
JMSTimestamp:
JMSCorrelationID: JMSDestination:
JMSReplyTo:
JMSRedelivered :

Après avoir traversé Defa de printemps Conversion ultJmsHeaderMapper, les en-têtes ci-dessous sont par défaut/manqués.

JMSPriority:
JMSDeliveryMode:
JMSExpiration:
JMSRedelivered:
JMSReplyTo:

J'ENABLED drapeau explicite-QOS dans JMS adaptateur sortant et je ne vois Priorité. Mais vous avez toujours des problèmes avec d'autres en-têtes.

Répondre

0

Le cas échéant, ils sont mis en correspondance des en-têtes JMS aux en-têtes de messagerie printemps:

GenericMessage [payload=sdf, headers={ 
jms_redelivered=false, 
jms_destination=queue://queue.demo, 
id=899e931b-7f77-3e92-9b95-349c0fc57afe, 
priority=4, 
jms_timestamp=1496695959175, 
jms_messageId=ID:gollum.local-65233-1496695954961-4:1:2:1:1, timestamp=1496695965782}] 

Le seul que je vois est manquante JMSDeliveryMode. À l'exception de la priorité, ils sont préfixés avec jms_. Tous les courtiers ne fournissent pas le mode de livraison sur les messages entrants; il ne s'applique généralement qu'à l'étranger. Si vous pouvez confirmer que votre courtier fournit effectivement le mode de livraison sur les messages entrants, nous pouvons ajouter le mappage (et/ou vous pouvez le faire dans une sous-classe du mappeur par défaut). Ouvrez un JIRA issue avec des preuves (par exemple, une capture d'écran d'un débogueur pour un message entrant) si vous souhaitez ajouter le mappage.

+0

Merci pour la réponse rapide. Mon courtier envoie en effet la priorité, deliverymode et timetolive (expiration). Je vais créer un problème JIRA et le partagerai avec vous. Pourriez-vous me dire quel en-tête dois-je définir pour JMSExpiration au printemps? quelque chose comme testMessageBuilder.setHeader ("timeToLive", 30L); En outre, existe-t-il une documentation dans Spring qui a les propriétés d'en-tête JMS par rapport aux propriétés d'en-tête Spring. – Selvakumar

+0

Ils sont définis en tant que constantes dans la classe JmsHeaders de spring-jms - les [javadocs montrent à quel en-tête JMS ils sont mappés] (http://docs.spring.io/spring/docs/current/javadoc-api/index. html? org/springframework/jms/support/JmsHeaders.html) mais les noms sont explicites. Oui, il semble que l'expiration soit également absente du mappage. –

+0

Le remplacement de DefaultJMSheaderMapper seul ne va pas ajouter ces en-têtes dans les messages Out. L'adaptateur sortant JMS utilise le DynamicJMSTemplate pour l'envoi; à son tour, il utilise DynamicJmsTemplateProperties pour définir la priorité. Je ne vois aucun champ pour ajouter/retreindre le deliveryMode ou l'expiration dans DynamicJMSTemplate ou Props. Je suis en train de contourner le JMSTemplate et de passer mon JMSTemplate personnalisé à Out Bound Adapter. Devra construire quelque chose de similaire à DynamicJMSTemplate car il utilise les supports ThreadLocal pour gérer la priorité de la gestion multi-thread – Selvakumar

0

ceci est une version simplifiée ce qui est mis en correspondance par le DefaultJmsHeaderMapper sur la partie entrant:

public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) { 
    Map<String, Object> headers = new HashMap<String, Object>(); 
     headers.put(JmsHeaders.MESSAGE_ID, messageId); 
     headers.put(JmsHeaders.DESTINATION, destination); 
     headers.put(JmsHeaders.CORRELATION_ID, correlationId); 
     headers.put(JmsHeaders.REPLY_TO, replyTo); 
     headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered()); 
     headers.put(JmsHeaders.TYPE, type); 
     headers.put(JmsHeaders.TIMESTAMP, jmsMessage.getJMSTimestamp()); 
     if (this.mapInboundPriority) { 
      headers.put(IntegrationMessageHeaderAccessor.PRIORITY, jmsMessage.getJMSPriority()); 
     } 
     Enumeration<?> jmsPropertyNames = jmsMessage.getPropertyNames(); 
      while (jmsPropertyNames.hasMoreElements()) { 
       String propertyName = jmsPropertyNames.nextElement().toString(); 
       String headerName = this.toHeaderName(propertyName); 
        headers.put(headerName, jmsMessage.getObjectProperty(propertyName)); 
       } 
      } 
     } 
    return headers; 
} 

Voulez-vous l'esprit de partager les journaux comment le regard de message après sur l'envoi au canal de message pour le JmsMessageDrivenEndpoint? OTOH vous pouvez toujours étendre/remplacer le par défaut et fournir votre propre mise en œuvre JmsHeaderMapper.

+0

Merci pour la réponse. Mon amont envoie la priorité, deliverymode et timetolive (expiration). On dirait que j'aurai fourni une implémentation propre pour les headers deliverymode et timetolive passthrough. Je vais créer une application de test avec des en-têtes minimaux et partagerai les journaux avec vous. Merci beaucoup ! – Selvakumar