2017-09-01 2 views
1

J'ai une application utilisant la solution apache-camel, et je voudrais envoyer un message à Websphere MQ Server via jms, convertir la propriété jms JMS_IBM_MQMD_MsgId en champ MQMD MQMD.MsgId, de sorte que je mets cette valeur sur le message par chameauApache Camel - Intégration Websphere MQ

exchange.getIn().setHeader(WMQConstants.JMS_IBM_MQMD_MSGID, "XXXXXXXXXXXXXXXXXXXXXXXX".getBytes()); 

Selon Apache Camel - IBM MQ integration, nous avons besoin d'un autre semble la définition des propriétés sur l'objet de destination. Référence Définition des options du fournisseur JMS sur la destination sur http://camel.apache.org/jms.html, Je fournis un composant DestinationResolver personnalisé pour le composant camel jms, définissez mdWriteEnabled, mdReadEnabled pour l'objet de destination.

<bean id="ibmMQServer01" class="org.apache.camel.component.jms.JmsComponent"> 
    <property name="connectionFactory" ref="ibmMQCredentialConnectionFactory01" /> 
    <property name="destinationResolver" ref="wmqDestinationResolver" /> 
</bean> 

et

public class WMQDestinationResolver implements DestinationResolver { 
    @Override 
    public Destination resolveDestinationName(Session session, String destinationName, 
      boolean pubSubDomain) throws JMSException { 
     MQSession mqSession = (MQSession) session; 
     MQQueue queue = (MQQueue) mqSession.createQueue("queue:///" + destinationName); 
     queue.setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true); 
     queue.setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true); 
     queue.setIntProperty(WMQConstants.WMQ_MQMD_MESSAGE_CONTEXT, WMQConstants.WMQ_MDCTX_SET_ALL_CONTEXT); 
     return queue; 
    } 
} 

Je peux obtenir JMS_IBM_MQMD_MsgId sur le récepteur tout en réglant mdReadEnabled est égal à vrai. Cependant, mdWriteEnabled ne semble pas fonctionne pour moi, et je reçois JMS_IBM_MQMD_MsgId comme une valeur inattendue AMQ CS.QA.CBSA.Q�Y�b (été analysé de byte [], totalement 24 octets).

Le JMSMessageID reçu est ID:414d512043532e51412e434253412e511987055902cc6222, qui peut être analysé avec la chaîne désordonnée ci-dessus.

Répondre

0

Je peux obtenir JMS_IBM_MQMD_MsgId sur le récepteur alors que le réglage mdReadEnabled est égal à vrai. Cependant, mdWriteEnabled ne semble pas fonctionne pour moi, et je reçois JMS_IBM_MQMD_MsgId comme une valeur inattendue « AMQ CS.QA.CBSA.QYb » » (analyse syntaxique de l'octet [], totalement 24 octets).

le reçu JMSMessageID est « ID: 414d512043532e51412e434253412e511987055902cc6222 », qui peut être parsé à la chaîne en désordre au-dessus

Ce que vous voyez est correct le uniqueID est un tableau d'octets de 24 octets Il est composé... Vous NE POUVEZ donc PAS l'utiliser comme une chaîne de caractères. Par conséquent, vous NE POUVEZ PAS l'utiliser en tant que chaîne de caractères

1

Je perce vers le bas code chameau et trouvez le casue racine

Bien que la propriété de réglage, il fonctionnera méthode getValidJMSHeaderValue de org.apache.camel.component.jms.JmsBinding

protected Object getValidJMSHeaderValue(String headerName, Object headerValue) { 
    if (headerValue instanceof String) { 
     return headerValue; 
    } else if (headerValue instanceof BigInteger) { 
     return headerValue.toString(); 
    } else if (headerValue instanceof BigDecimal) { 
     return headerValue.toString(); 
    } else if (headerValue instanceof Number) { 
     return headerValue; 
    } else if (headerValue instanceof Character) { 
     return headerValue; 
    } else if (headerValue instanceof CharSequence) { 
     return headerValue.toString(); 
    } else if (headerValue instanceof Boolean) { 
     return headerValue; 
    } else if (headerValue instanceof Date) { 
     return headerValue.toString(); 
    } 
    return null; 
} 

Semble chameau rejeter la valeur de tableau d'octets et retourner null, de sorte que fournisseur jms ne peut pas appliquer propriété de JMS_IBM_MQMD_MsgId. Je substitue cette méthode pour la restaurer.

Remarque: Je crée simplement la même classe org.apache.camel.component.jms.JmsBinding dans le dossier source src/main/java, le chargeur de classe charge par défaut cette classe au lieu de la classe de la bibliothèque maven.

+0

Existe-t-il un moyen de soumettre un rapport de bogue à Apache Camel pour qu'il soit pris en charge en amont? – JoshMc