2015-09-24 39 views
1

我在apache上構建了一個web服務,作爲karaf上的一個包,它接受請求並將信息保存在數據庫中。在另一條路線上的Apache駱駝藍圖Web服務響應

在此之後,另一個捆綁包將獲取此插入的記錄,修改數據並將其保存回數據庫。

現在我需要的原始請求包含修改後的數據的響應因此,除了對看起來像這樣

<route id="cxf"> 
    <from uri="cxf:bean:getHopEndpoint" /> 
    <recipientList> 
     <simple>direct:${header.operationName}</simple> 
    </recipientList> 
</route> 
<route id="getHop"> 
    <from uri="direct:getHop" /> 
    <process ref="getHopToDbProcessor" /> 
    <to 
     uri="sql:INSERT INTO myTable (field1, field2) VALUES (:#field1, :#field2)"/> 
</route> 

Web服務的路線,我需要一個又一個這樣的

<route id="cxfResponse"> 
    <from uri="sql:SELECT * FROM myTable"/> 
    <!-- to web service response in any way --> 
</route> 

有沒有辦法做到這一點?

回答

1

您必須將主體設置爲期望的響應,作爲第一條路線的最後一步。無法在此路線外設置響應。

所以我認爲有兩種方法可以解決您的問題。

  1. 是否所有你需要的第一個路由裏面做以同步的方式
  2. 改變你的服務是完全異步

對於變2您可以使用短信像JMS或你給的首先打電話給webservice uri回電。

如果您的服務負載很重,完全異步方法可能會使您的系統更好地工作。

+0

對於變體1:是否強制其他包的操作停留在另一個包中,而不是同一個包中的同步。對於變體2:我無法做任何事情調用Web服務,所以我也不能設置一個URI來回叫。當我使用jms時,有可能在路由中等待,直到我從另一個包中收到答案爲止。 – Milla

+0

所以變體1是好的。您可以使用direct-vm,OSGi服務或任何其他同步調用來完成部分工作。響應只需要在同一個線程上返回 –

1

我發現了另一種解決方案:我正在使用Direct VM Component。我的路線是這樣的現在:

包1所收到的Web服務請求,並保存數據庫中的數據:

<route id="cxf"> 
    <from uri="cxf:bean:getHopEndpoint" /> 
    <recipientList> 
      <simple>direct:${header.operationName}</simple> 
    </recipientList> 
</route> 
<route id="getHop"> 
    <from uri="direct:getHop" /> 
    <process ref="getHopToDbProcessor" /> 
    <to uri="sql:INSERT INTO myTable (field1, field2) VALUES (:#field1, :#field2)" /> 
    <to uri="direct-vm:processHop" /> 
</route> 

在束2,其處理我剛插入的數據:

<route> 
    <from uri="direct-vm:processHop"/> 
    <to uri="sql:SELECT * FROM myTable WHERE processed = false" /> 
    <process ref="getHopComputopUrlProcessor" /> 
    <to uri="sql:UPDATE webshop_gethop_requests SET new_data = :#newData, processed = true WHERE some_id = :#someId" /> 
    <to uri="direct-vm:response"/> 
</route> 

然後回到捆綁1再發送響應與處理的數據:

<route> 
    <from uri="direct-vm:response" /> 
    <to uri="sql:SELECT some_id,new_data FROM myTable WHERE some_id = :#someId AND processed = true" /> 
    <process ref="getHopResponseProcessor" /> 
</route> 

T他的作品對我來說很好:)