2017-09-01 130 views
1

我有一个应用程序使用apache-camel解决方案,并希望通过jms向Websphere MQ Server发送消息,将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,我对骆驼的JMS组件提供自定义DestinationResolver的,对目标对象设置mdWriteEnabledmdReadEnabled

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

我可以接收得到JMS_IBM_MQMD_MsgId而设置mdReadEnabled等于true。然而,mdWriteEnabled似乎不是为我工作,我也得到JMS_IBM_MQMD_MsgId作为一个意外的值AMQ CS.QA.CBSA.Q�Y�b(byte []转换,共24个字节被解析)。

收到的JMSMessageIDID:414d512043532e51412e434253412e511987055902cc6222,可以解析为上面的乱码字符串。

回答

0

我可以在接收器上获得JMS_IBM_MQMD_MsgId,同时设置mdReadEnabled 等于true。然而,mdWriteEnabled似乎没有对我的作品,我也得到 JMS_IBM_MQMD_MsgId作为一个意外的值 “AMQ CS.QA.CBSA.QYb”” (byte []转换,共24个字节被解析)。

接收JMSMessageID按是 “ID:414d512043532e51412e434253412e511987055902cc6222”,其可被 解析上述凌乱串

你看到什么是正确的msgid是24个字节的字节数组它是由。字符串和二进制值的。因此,你不能使用它作为一个字符串。

1

我深入骆驼代码并找到根casue

虽然设置JMS属性,它将运行的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; 
} 

方法getValidJMSHeaderValue似乎骆驼拒绝字节数组值和返回null,让JMS提供者不能申请JMS_IBM_MQMD_MsgId的财产。我重写这个方法来解决它。

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

+0

有没有办法提交给Apache的骆驼的bug报告有这种照顾的上游? – JoshMc