当前位置: 首页 > 知识库问答 >
问题:

Apache Camel--Websphere MQ集成

颜君浩
2023-03-14

我有一个使用apache-camel解决方案的应用程序,希望通过jms将消息发送到Websphere MQ Server,将jms属性jms_ibm_mqmd_msgid转换为MQMD字段MQMD.msgid,以便通过camel在消息上设置该值

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

根据Apache Camel-IBM MQ集成,我们似乎需要在目标对象上设置另一个属性。在http://camel.apache.org/JMS.html上,我为camel 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;
    }
}

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

共有1个答案

锺超英
2023-03-14

我钻取camel代码并找到根实例

在设置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;
}

似乎camel拒绝字节数组值并返回null,因此jms提供程序无法应用jms_ibm_mqmd_msgid的属性。我重写了这个方法以使其恢复。

 类似资料:
  • 我正在尝试向异步路由发送消息,但它不起作用。我刚刚在github上创建了一个项目来模拟这个问题

  • 我正在使用apache camel cxf开发一个Web服务(肥皂),我遇到了这个错误。 Java . lang . illegalargumentexception:Part { http://blue print . camel . ngt . TN/}返回的类型应为[ltn . ngt . camel . blue print . WB _ subscriptions;,而不是org . A

  • 我有一个restendpoint示例。org,返回表单的json响应 我的路线是这样的 我读过关于轮询消费者的内容,但找不到如何继续轮询endpoint的示例,直到它返回“success”响应。 是否应该使用轮询消费者?如果是这样的话,可以举一个与我的案例相关的例子。用于轮询restendpoint的任何其他资源都非常有用。

  • 我试图在聚合器完成后获得一个回复,但是我得到一个异常,我没有指定任何聚合器子项,但是当我指定一个。to()endpoint我没有收到聚合结果。。。这可能吗? 控制器: 聚合器:

  • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

  • 我试图将一些消息从JMS代码放到本地队列管理器中定义的本地队列中。我在WebSphere MQ中定义了一个本地队列,并使用JMS代码放置消息。我在这里做得对吗。我没有看到WebSphere队列中的消息。 以下是代码:

  • 我从基于apache-camel-spark的rest接口获得一个json数组作为输入。开始时,我想通过apache camels路线分割json-array来处理每个元素。我该怎么做? 我的测试输入json: 对于这个问题,我在stackoverflow上找到了一些间接描述的问题: link 1, link 2, link 3。 根据这些示例,我尝试了以下骆驼路线: 当我这样做时,我总是得到以下

  • Apache Camel:2.12.2,activemq:5.7 我们注意到,在下面的路由中,对于前100次交换,节流工作正常。此后,它不是每秒发送100次交换,而是每秒仅发送1次交换。现在,如果我们将timePeriodMillis设置为100,它似乎可以正常工作。注意,我们同时发送500个交换。