首先,感谢大家的支持。我的用例如下(上面也有)。
使用Apache Camel连接到MQ主机(主机名,queueManager,端口,通道),并使用属于同一主机/ Qmanager的队列中的消息。消息带有ReplyToQueue(JMSReplyTo)标头值。ReplyToQueue(JMSReplyTo)的值如下
例如
queue://Different_QueueManager_in_Cluster/TEST.REPLY?mdReadEnabled=true&messageBody=0&mdWriteEnabled=true&XMSC_WMQ_REPLYTO_STYLE=1&targetClient=1
现在的问题是,当连接对象连接到上述主机和队列管理器时,如何使用不同的队列管理器将回复消息发送到不同的队列。
注意:所有MQ队列管理器都在集群环境中。
例如
form(wmq:queue:INPUT_MSG_Q)
.bean(requestProcessor)
.bean(responseProcessor)
默认情况下,Apache Camel处理ReplyToQ(JMSReplyTo)。如果您不想发送对ReplyToQ(JMSReplyTo)的回复,请disableReplyTo=true
在消费时使用
注意:在queue://Different_QueueManager_in_Cluster/TEST.REPLY
使用相同的连接/连接工厂发送到时,MQ集群将检查消息是否必须通过集群中的指定队列发送到指定的队列管理器。关于以下参数?mdReadEnabled=true&messageBody=0&mdWriteEnabled=true&XMSC_WMQ_REPLYTO_STYLE=1&targetClient=1
,Apache Camel能够在自动回复时自动解析,而无需使用任何第三方解析器JMSReplyTo
。
使用禁用自动回复disableReplyTo=true
并从标头中获取队列详细信息,并使用纯javax.jms。和com.ibm.mq.jms。 api发送消息。代码如下。
@Override
public void process(Exchange exchange)
throws Exception {
QueueConnection m_connection = this.connectionFactory.createQueueConnection();
//m_connection.start();
boolean transacted = false;
QueueSession session = m_connection.createQueueSession(transacted, QueueSession.AUTO_ACKNowLEDGE);
TextMessage outMessage = session.createTextMessage();
outMessage.setText(exchange.getIn().getBody());
MQQueue mq = new MQQueue(
"queue://Different_QueueManager_in_Cluster/TEST.REPLY");
QueueSender queueSender = session.createSender((MQQueue) mq);
queueSender.send(outMessage);
/* producerTemplate.send("wmq:" + "queue://Different_QueueManager_in_Cluster/TEST.REPLY", exchange); */
}
对于参数,请使用@Sebastian Brandt提到的目标解析器(发布)