2014-06-16 49 views
0

目前我正在使用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,我們可以看到,我有用於輸入和2 WMQ端點,1個寫,1個用於讀取HTTP端點。

我要的是:

  1. 從HTTP接收請求,處理它,並寫請求消息Queue.Write WMQ。
  2. 在請求消息寫入Queue.Write wmq之後,我想從Queue.Read wmq讀取響應,然後將其發送回第一個路由,並執行一些數據轉換
  3. 在完成所有步驟已完成,那麼我想將回應發送回http端點。

我從Apache的駱駝閱讀下列文件,並試圖做的建議:

  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:OUT消息不是 收到的內容:20000 millis應答消息與correlationID: cid未收到。 Exchange [Message: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 /在 org.apache.camel.component.jms.reply.ReplyManagerSupport.processReply(ReplyManagerSupport.java:133)在 org.apache.camel.component.jms.reply mobako11.2] .TemporaryQueueReplyHandler.onTimeout(TemporaryQueueReplyHandler.java:61) 在 org.apache.camel.component.jms.reply.CorrelationTimeoutMap.onEviction(CorrelationTimeoutMap.java:53) 在 org.apache.camel.component.jms.reply (CorrelationTimeoutMap.java:30) at org.apache.camel.support.Default TimeoutMap.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(未知 來源)在 java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access 301 $(未知 來源)在 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

和我的第二流Queue.Read後加入

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

但是,現在我需要在Apache Camel中做到這一點。駱駝有什麼辦法可以這樣做嗎?或者你有一些關於如何解決我的問題的想法(無需更改wmq端點)。謝謝你的幫助。

回答

0

由於設置了JMSDestiantion hader queue:///LSMH.ZKSEAP.SERVICEBUS?targetClient=1然後駱駝將消息發送到隊列LSMH.ZKSEAP.SERVICEBUS因此需要在該隊列中,用於處理所述消息的監聽器,併發送回由標準JMSReplyTo頭定義的應答消息。

因爲你沒有設置任何特殊的replyTo,所以Camel使用一個臨時隊列。不確定IBM WebSphere是否支持這一點。所以你可能想要設置一個固定的JMSReplyTo頭。在Camel JMS文檔中提供更多細節。

您擁有的第二條路線可能未被使用,因爲它從Queue.Read中讀取,而您沒有發送信息。

但是再次閱讀該JMS頁面,並注意通過JMS使用共享/臨時或排他應答隊列的各種回覆。

+0

我可以使用直接或其他端點而不是隊列來監聽嗎? – pokopang