Camel:请求回复不同的端点

时间:2014-06-16 07:21:49

标签: 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>

在那些reoutes上,我们可以看到我有用于输入的http端点和2个wmq端点,1个用于写入,1个用于读取。

我想要的是:

  1. 从http接收请求,处理它,并将请求消息写入Queue.Write wmq。
  2. 在Queue.Write wmq中写入请求消息后,我想从Queue.Read wmq读取响应,然后将其发送回第一条路径,并进行一些数据转换
  3. 完成所有操作后,我想将响应发送回http端点。
  4. 我已阅读Apache Camel的以下文档并尝试按照建议执行操作:

    1. http://camel.apache.org/request-reply.html
    2. http://camel.apache.org/jms.html
    3. 以及其他一些相关资源
    4. 但没有什么对我有用。

      1. InOut交换模式不起作用,因为我对请求 - 回复使用了不同的端点
      2. 我试图通过添加以下内容在我的Queue.Read端点上声明JMSCorrelationID和JMSReplyTo:
      3. <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上执行此操作并使用以下方法成功实施:

        Mule-Example

        并添加

        <vm:outbound-endpoint path="response"/>
        

        在我的队列之后。阅读第二个流程。

        但是,现在我需要在Apache Camel中完成它。有没有办法在Camel中这样做?或者您对如何解决我的问题有所了解(不更改wmq端点)。谢谢你的帮助。

1 个答案:

答案 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上进行的各种回复。