我在Spring中配置了一个Apache Camel路由,该路由从JMS(ActiveMQ)队列接收消息,转换消息并使用CXF组件将结果发送到Web服务。这一切都运行良好,但我总是在路径的末尾抛出异常,CXF响应对象不可同步,指的是它正在尝试将交换/消息体转换回JMS消息。但为什么呢?
这是我的骆驼背景提取: -
<route>
<from uri="jms:queue:transactions" />
<process ref="convertToFormatForCXF" />
<to uri="cxf:bean:myService?defaultOperationName=process" />
<stop />
</route>
这是日志中的一个片段: -
EndpointMessageListener WARN Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - java.lang.RuntimeException: net.sophis.soa.dataexchange.LogoutResponse]
org.apache.camel.RuntimeCamelException: java.lang.RuntimeException: net.sophis.soa.dataexchange.LogoutResponse
at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1363)
at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:124)
即使不阻止堆栈跟踪。现在我发现如果我将disableReplyTo = true添加到JMS使用者那么堆栈跟踪不会显示哪个是优秀的。
我想我只是想弄清楚发生了什么?是否将CXF响应对象添加到“事务”JMS队列中?我的目的是在CXF制作人完成后停止流程。
有人可以帮我理解吗? Camel文档对此没什么帮助。
答案 0 :(得分:2)
CXF响应对象是否会被添加到&#39;交易&#39; JMS队列?
没有。它本来会被添加到临时队列中。
来自http://camel.apache.org/jms.html#JMS-Request-replyoverJMS
JmsProducer检测InOut并提供带有要使用的回复目标的JMSReplyTo标头。默认情况下,Camel使用临时队列,但您可以使用端点上的replyTo选项指定固定的回复队列(请参阅下面有关固定回复队列的详细信息)。 Camel将自动设置一个消费者,该消费者会在回复队列中进行监听,因此您不应该做任何事情。