目前我正在使用 Apache Camel。我想要做的是配置请求回复。这是我的路线:
<route>
<from uri="jetty:http://localhost:8888/uebermittleAusweisdaten"/>
<process ref="TransformToXML"/>
<to uri ="xslt:mobako.sender.xsl"/>
<setHeader headerName="CamelJmsDestinationName">
<constant>queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1</constant>
</setHeader>
<setHeader headerName="JMS_IBM_Character_Set">
<constant>ISO8859_1</constant>
</setHeader>
<setHeader headerName="JMSCorrelationID">
<constant>cid</constant>
</setHeader>
<to uri="jms:queue:Queue.Write"/>
<marshal ref="xmljson"/>
<!-- <process ref="ResponseToHTML"/> -->
</route>
<route>
<from uri="jms:queue:Queue.Read" />
<setBody><simple>IN: ${headers}</simple></setBody>
<to uri="stream:out"/>
</route>
在这些重新路由上,我们可以看到我有用于输入的 http 端点和 2 个 wmq 端点,1 个用于写入,1 个用于读取。
我想要的是:
- 接收来自http的请求,处理它,并将请求消息写入Queue.Write wmq。
- 请求消息写入Queue.Write wmq后,我想从Queue.Read wmq读取响应,然后将其发送回第一个路由,并进行一些数据转换
- 完成所有操作后,我想将响应发送回 http 端点。
我已阅读 Apache Camel 的以下文档并尝试按照建议进行操作:
但对我来说没有任何效果。
- InOut 交换模式不起作用,因为我使用不同的端点进行请求-回复
- 我尝试通过添加以下内容在我的 Queue.Read 端点上声明 JMSCorrelationID 和 JMSReplyTo:
<interceptFrom uri="jms:queue:ZKSEAP.LSMH.SERVICEBUS"> <setHeader headerName="JMSCorrelationID"> <constant>cid</constant> </setHeader> <setHeader headerName="JMSReplyTo"> <constant>queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1</constant> </setHeader> </interceptFrom>
但它也没有用,而且,我只是不断地得到以下错误:
org.apache.camel.ExchangeTimedOutException: The OUT message was not received within: 20000 millis due reply message with correlationID: cid not received. Exchange[Message: http://security.fraport.de/zks-eap/uebermittleAusweisdatenurn:uuid:ID-FRA000000085404-55438-1402901836300-0-2esbp://services.fraport.de/lsmh/mobakoesbp://services.fraport.de/lsmh/zks-eapesbp://services.fraport.de/lsmh/mobako11.2] at org.apache.camel.component.jms.reply.ReplyManagerSupport.processReply(ReplyManagerSupport.java:133) at org.apache.camel.component.jms.reply.TemporaryQueueReplyHandler.onTimeout(TemporaryQueueReplyHandler.java:61) at org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:53) at org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:30) at org.apache.camel.support.DefaultTimeoutMap.purge(DefaultTimeoutMap.java:212) at org.apache.camel.support.DefaultTimeoutMap.run(DefaultTimeoutMap.java:162) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.runAndReset(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
仅供引用,我已尝试在 Mule ESB 上这样做并通过使用成功实现它:
并添加
<vm:outbound-endpoint path="response"/>
在我的 Queue 之后。阅读第二个流程。
但是,现在我需要在 Apache Camel 中完成。在 Camel 中有什么方法可以这样做吗?或者您是否知道如何解决我的问题(不更改 wmq 端点)。感谢您的帮助。
最佳答案
因为您设置了 JMSDestiantion hader queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1
然后 Camel 将消息发送到队列 LSMH.ZKSEAP.SERVICEBUS
所以你需要在那个队列上有一个监听器,它处理消息,并发回由标准 JMSReplyTo
header 定义的回复消息。
而且因为你没有设置任何特殊的replyTo,所以Camel使用了一个临时队列。不确定 IBM WebSphere 是否支持这个。所以您可能想要设置一个固定的 JMSReplyTo header 。在 Camel JMS 文档中查看更多详细信息,因为它谈到了这一点。
您拥有的第二条路线可能未被使用,因为它从您未向其发送消息的 Queue.Read
中读取。
但请再次阅读该 JMS 页面,并注意使用共享/临时或独占回复队列通过 JMS 进行的不同类型的回复。
关于http - Camel : Request Reply Different Endpoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238458/