http - Camel : Request Reply Different Endpoint

标签 http request apache-camel ibm-mq reply

目前我正在使用 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 个用于读取。

我想要的是:

  1. 接收来自http的请求,处理它,并将请求消息写入Queue.Write wmq。
  2. 请求消息写入Queue.Write wmq后,我想从Queue.Read wmq读取响应,然后将其发送回第一个路由,并进行一些数据转换
  3. 完成所有操作后,我想将响应发送回 http 端点。

我已阅读 Apache Camel 的以下文档并尝试按照建议进行操作:

  1. http://camel.apache.org/request-reply.html
  2. http://camel.apache.org/jms.html
  3. 以及其他一些相关资源

但对我来说没有任何效果。

  1. InOut 交换模式不起作用,因为我使用不同的端点进行请求-回复
  2. 我尝试通过添加以下内容在我的 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 上这样做并通过使用成功实现它:

Mule-Example

并添加

<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/

相关文章:

javascript - 如何返回对象而不是字符串来响应诺克?

java - 从 BufferedReader 中提取行时无法退出 Java 中的 while 循环

java - Camel 邮件 IMAP 不跳过失败的邮件

Linux 上的 Java SSL 连接重置,Windows 工作正常

python - 循环浏览页面总是得到相同的结果

ios - AFHttpClient post 在正文中包含参数和 JSON

javascript - AngularJS 从 $http 中获取未定义

Ruby 检查 webdav 上传是否完成

Android: fragment 中的Http请求

web-services - 使用 Websphere MQ 时,Camel JMS 对象消息有效负载从对象转换为字节消息