目前我正在使用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>
在那些reoutes上,我们可以看到我有用于输入的http端点和2个wmq端点,1个用于写入,1个用于读取。
我想要的是:
我已阅读Apache Camel的以下文档并尝试按照建议执行操作:
但没有什么对我有用。
<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:OUT消息不是 收到:20000毫米到期回复消息与correlationID: 没有收到cid。交流[消息:http://security.fraport.de/zks-eap/uebermittleAusweisdaten urn:uuid:ID-FRA000000085404-55438-1402901836300-0-2esbp://services.fraport.de/lsmh/mobakoesbp://services.fraport.de/lsmh/zks-eapesbp ://services.fraport.de/lsmh/mobako11.2] 在 org.apache.camel.component.jms.reply.ReplyManagerSupport.processReply(ReplyManagerSupport.java:133) 在 org.apache.camel.component.jms.reply.TemporaryQueueReplyHandler.onTimeout(TemporaryQueueReplyHandler.java:61) 在 org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:53) 在 org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:30) 在 org.apache.camel.support.DefaultTimeoutMap.purge(DefaultTimeoutMap.java:212) 在 org.apache.camel.support.DefaultTimeoutMap.run(DefaultTimeoutMap.java:162) 在java.util.concurrent.Executors $ RunnableAdapter.call(未知 来自java.util.concurrent.FutureTask.runAndReset(未知 来源)at java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 301(未知 来源)at java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.run(未知 来自)java.util.concurrent.ThreadPoolExecutor.runWorker(未知 来自java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知 来自java.lang.Thread.run(未知来源)
仅为了您的信息,我已尝试在Mule ESB上执行此操作并使用以下方法成功实施:
并添加
<vm:outbound-endpoint path="response"/>
在我的队列之后。阅读第二个流程。
但是,现在我需要在Apache Camel中完成它。有没有办法在Camel中这样做?或者您对如何解决我的问题有所了解(不更改wmq端点)。谢谢你的帮助。
答案 0 :(得分:1)
因为您设置了JMSDestiantion hader queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1
,所以Camel将消息发送到队列LSMH.ZKSEAP.SERVICEBUS
,因此您需要该队列上的侦听器,该侦听器处理该消息,并发回由该消息定义的回复消息。标准JMSReplyTo
标题。
因为你没有设置任何特殊的回复,所以Camel使用了一个临时队列。不确定IBM WebSphere是否支持此功能。因此,您可能希望设置固定的JMSReplyTo标头。请参阅Camel JMS doc上的更多详细信息。
您拥有的第二条路线可能没有被使用,因为它是从Queue.Read
读取的,而您没有发送消息。
但是再次阅读该JMS页面,并注意通过共享/临时或独占回复队列在JMS上进行的各种回复。