Apache camel ApacheCamel—Websphere MQ集成

Apache camel ApacheCamel—Websphere MQ集成,apache-camel,jms,ibm-mq,Apache Camel,Jms,Ibm Mq,我有一个使用apache camel解决方案的应用程序,希望通过jms向Websphere MQ服务器发送消息,将jms属性jms\u IBM\u MQMD\u MsgId转换为MQMD字段MQMD.MsgId,以便通过camel在消息上设置此值 exchange.getIn().setHeader(WMQConstants.JMS_IBM_MQMD_MSGID, "XXXXXXXXXXXXXXXXXXXXXXXX".getBytes()); 根据,似乎我们需要在目标对象上设置另一个属性。参考

我有一个使用apache camel解决方案的应用程序,希望通过jms向Websphere MQ服务器发送消息,将jms属性
jms\u IBM\u MQMD\u MsgId
转换为MQMD字段
MQMD.MsgId
,以便通过camel在消息上设置此值

exchange.getIn().setHeader(WMQConstants.JMS_IBM_MQMD_MSGID, "XXXXXXXXXXXXXXXXXXXXXXXX".getBytes());
根据,似乎我们需要在目标对象上设置另一个属性。参考在目标上设置JMS提供程序选项在上,我为驼峰JMS组件提供了自定义的DestinationResolver,为目标对象设置
mdWriteEnabled
mdReadEnabled

<bean id="ibmMQServer01" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="ibmMQCredentialConnectionFactory01" />
    <property name="destinationResolver" ref="wmqDestinationResolver" />
</bean>
当设置
mdReadEnabled
等于true时,我可以在接收器上获得
JMS\u IBM\u MQMD\u MsgId
。然而,
mdWriteEnabled
似乎对我不起作用,我得到了
JMS\u IBM\u MQMD\u MsgId
作为一个意外值
AMQ CS.QA.CBSA.Q�Y�b
(已从字节[]解析,共24个字节)

接收到的
JMSMessageID
ID:414D512043532E51412E434253412E511997055902CC6222
,可以解析为上面的凌乱字符串

设置mdReadEnabled时,我可以在接收器上获取JMS_IBM_MQMD_MsgId 等于真的。然而,mdWriteEnabled似乎不适合我,我 JMS_IBM_MQMD_MsgId作为意外值“AMQ CS.QA.CBSA.Q�Y�b“ (已从字节[]解析,共24个字节)

收到的JMSMessageID为 “ID:414D512043532E51412E434253412E5111987055902CC6222”,可以 解析为上面凌乱的字符串


您看到的是正确的。MsgId是一个由24个字节组成的字节数组。它由字符串和二进制值组成。因此,您不能将其用作字符串。

我深入研究驼峰代码并找到根原因

设置jms属性时,它将运行
org.apache.camel.component.jms.JmsBinding的方法
getValidJMSHeaderValue

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;
}
似乎拒绝字节数组值并返回null,因此jms提供程序无法应用
jms\u IBM\u MQMD\u MsgId
的属性。我重写此方法以解决此问题


注意:我只需在源文件夹
src/main/java
中创建相同的类
org.apache.camel.component.jms.jmsbind
,类加载器将默认加载该类,而不是从maven库中加载该类。

是否有办法向apache camel提交错误报告,以便在上游解决此问题?
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;
}