2017-09-01 13 views
1

私はapache-camelソリューションを使用しているアプリケーションを持っていて、Websphere MQ Serverにjmsを通してメッセージを送信したい場合は、jmsプロパティJMS_IBM_MQMD_MsgIdをMQMDフィールドMQMD.MsgIdに変換してください。Apache Camel - Websphere MQ統合

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

Apache Camel - IBM MQ integrationによると、宛先オブジェクトに別のプロパティ設定が必要なようです。参照宛先のJMSプロバイダーオプションをに設定すると、http://camel.apache.org/jms.htmlには、宛先オブジェクト用にmdWriteEnabledmdReadEnabledと設定して、ラクダjmsコンポーネントのカスタムDestinationResolverを提供します。

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

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; 
    } 
} 

mdReadEnabledを設定することがtrueの間、私は受信機にJMS_IBM_MQMD_MsgIdを得ることができます。しかし、mdWriteEnabledは私にとってはうまくいかず、JMS_IBM_MQMD_MsgIdが予期しない値AMQ CS.QA.CBSA.Q�Y�b(バイト[]から解析された、完全に24バイト)となります。

受信したJMSMessageIDID:414d512043532e51412e434253412e511987055902cc6222であり、これは上記の乱雑な文字列に解析することができます。

答えて

0

mdReadEnabled をtrueに設定している間に、受信者にJMS_IBM_MQMD_MsgIdを取得できます。しかし、mdWriteEnabledは私のためではない作品だ、と私は が(バイト[]、完全に24バイトから解析された)、予期しない値「AMQ CS.QA.CBSA.QYb」」として JMS_IBM_MQMD_MsgIdを得る。

受信JMSMessageIDをが 「ID:414d512043532e51412e434253412e511987055902cc6222」である。、 上記汚い文字列に解析することができます

あなたが見ていることは正しいのMsgIdが24バイトのバイト配列であることが作られています。 BOTH文字列とバイナリ値の両方が含まれているため、文字列として使用することはできません。

1

Iラクダコードをドリルダウンし、ルートcasue

を見つけるJMSプロパティを設定しますが、それはメソッドを実行しますgetValidJMSHeaderValue

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; 
} 

それはJMSプロバイダのでラクダは、バイト配列の値と戻りヌルを拒否思え適用することはできませんプロパティはJMS_IBM_MQMD_MsgIdです。私はそれをむかつくためにこのメソッドをオーバーライドします。

注:ソースフォルダsrc/main/javaに同じクラスorg.apache.camel.component.jms.JmsBindingを作成するだけで、クラスローダーはデフォルトでmavenライブラリのクラスの代わりにこのクラスをロードします。

+0

アップストリームでこれを処理するためにApache Camelにバグレポートを提出する方法はありますか? – JoshMc