Apache camel 蓝图 Web 服务在另一条路线中的响应
Apache camel blueprint web service response in another route
我在 apache camel 中构建了一个 Web 服务 运行 作为 karaf 上的一个包,它接收请求并将信息保存在数据库中。
在此之后,另一个 bundle 获取这条插入的记录,修改数据并将其保存回数据库。
现在我需要原始请求的响应来包含修改后的数据,所以除了看起来像这样的 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>
我需要另一个这样的
<route id="cxfResponse">
<from uri="sql:SELECT * FROM myTable"/>
<!-- to web service response in any way -->
</route>
有什么办法吗?
作为第一条路线的最后一步,您必须将正文设置为所需的响应。无法在此路由之外设置响应。
所以我认为有两种方法可以解决你的问题。
- 以同步方式在第一条路线内完成所有您需要做的事情
- 将您的服务更改为完全异步
对于变体 2,您可以使用像 jms 这样的消息传递,或者给第一个调用一个网络服务 uri 以进行回调。
如果您的服务负载很高,完全异步的方法可能会使您的系统运行得更好。
我找到了另一个解决方案:我正在使用 Direct VM Component。我的路线现在看起来像这样:
Bundle 1 接收网络服务请求并将数据保存在数据库中:
<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>
然后再次返回 bundle 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>
这对我来说很好:)
我在 apache camel 中构建了一个 Web 服务 运行 作为 karaf 上的一个包,它接收请求并将信息保存在数据库中。
在此之后,另一个 bundle 获取这条插入的记录,修改数据并将其保存回数据库。
现在我需要原始请求的响应来包含修改后的数据,所以除了看起来像这样的 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>
我需要另一个这样的
<route id="cxfResponse">
<from uri="sql:SELECT * FROM myTable"/>
<!-- to web service response in any way -->
</route>
有什么办法吗?
作为第一条路线的最后一步,您必须将正文设置为所需的响应。无法在此路由之外设置响应。
所以我认为有两种方法可以解决你的问题。
- 以同步方式在第一条路线内完成所有您需要做的事情
- 将您的服务更改为完全异步
对于变体 2,您可以使用像 jms 这样的消息传递,或者给第一个调用一个网络服务 uri 以进行回调。
如果您的服务负载很高,完全异步的方法可能会使您的系统运行得更好。
我找到了另一个解决方案:我正在使用 Direct VM Component。我的路线现在看起来像这样:
Bundle 1 接收网络服务请求并将数据保存在数据库中:
<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>
然后再次返回 bundle 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>
这对我来说很好:)