2014-11-04 106 views
1

我有一個與Web服務交談的Apache駱駝應用程序。這純粹是一個集成(中介)應用程序。我們接收REST請求並將其轉換爲SOAP消息(使用VM模板)並調用Web服務。接收來自Web服務的響應,將其轉換爲JSON併發回給我們的客戶端。收到Web服務響應後Http請求和響應丟失了?

REST ---->轉換爲SOAP req(Velocity模板)---->調用WS ---->接收響應---->轉換成JSON ---->返回對調用者的響應。

我們使用servlet端點來接收來自客戶端的請求。我們可以從交易所獲得HttpSession對象調用Web服務,如下之前:

HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); 
HttpSession session = req.getSession(); 

然而,問題是,我不能接受來自Web服務的響應之後,從交換獲得的HTTPSession。如果我以調試模式檢查Exchange對象,Exchange.getIn()的類型是DefaultMessage而不是HttpMessage。這就是我認爲我鬆散了請求和響應對象的原因。

我嘗試將交換模式設置爲InOut,但這沒有幫助。 我能找到的唯一解決方案是將消息的原始正文存儲在標題或屬性中,並在末尾檢索它。但我認爲這必須有更好的解決方案。

請問有人可以幫忙嗎?

注意:我們需要HttpSession,因此我們可以存儲相應的會話信息,例如在WS上爲由我們的請求創建的會話創建的會話ID。我們無法將在WS上創建的會話信息傳遞給我們的調用者,並且需要在我們的應用程序上放置一個位置來保存此映射信息。 HttpSession滿足這個要求。有沒有更好的方法?

+0

您是否嘗試過Content Enricher(http://camel.apache.org/content-enricher.html)模式? – Sergey 2014-11-04 12:02:33

+0

@Sergey謝謝你回覆我的問題。我嘗試使用Enrich EIP。理論上這是最好的方法,但由於使用VM模板而面臨問題。正如我所說的,我們使用VM模板來準備SOAP請求。不久之後,我調用 Amit 2014-11-05 09:42:22

回答

0

您可以將http會話存儲爲交換屬性,駱駝將這些屬性複製到交換機上,以便您可以在需要時在路由中訪問它。

+0

Thanks @ willem-你提出的方法符合這個目的,我嘗試使用Enrich EIP,但是有一些問題。 – Amit 2014-11-05 09:44:06