我有使用JBoss FUSE上使用camel开发的Web服务接口的应用程序,我将接收消息保存到数据库中,没有任何问题。但是现在我需要增强它来做一些耗时的过程,比如Web服务调用。
我的想法是将接收消息添加到MessageQueue中,然后发送Web服务调用响应。然后通过读取消息队列来执行耗时的过程。但我的问题是,是否可以在驼峰中运行后台路由来执行此类实现。
我尝试使用多播来实现它,但在那里它等待所有路由完成。
下图显示了我尝试存档的内容。
我的问题是可以在完成路线2之前从路线1发送响应吗?如果可能的话我怎样才能使用驼峰归档它?
我对Camel开发很新,我想知道是否可以完成上述方案。请善意提供有关此的反馈?
答案 0 :(得分:1)
绝对可能。这是一个例子:
<route id="HandleRequest">
<from uri="http:incomingWebRequest" />
<to uri="database:saveData" />
<to uri="activemq:queue:queueName" />
<to uri="bean:processWebRequest" />
<to uri="http:sendResponse" />
</route>
<route id="BackgroundLongProcess">
<from uri="activemq:queue:queueName" />
<to uri="bean:timeConsumingProcess" />
<to uri="database:updateProcessedData" />
</route>
在 HandleRequest 路由中,正文将被发送到ActiveMQ队列。这通常是一种快速操作 BackgroundLongProcess 路由将由ActiveMQ队列异步触发,您的处理可能需要更长的时间。
在我的示例中,我将主体发送到ActiveMQ并直接处理它,您可以发送数据库主键并在处理之前从数据库重新加载数据。
然后,您可以在2个不同的软件包中开发应用程序,一个用于处理HTTP部分,另一个用于执行后台处理。这将改善模块化,您可以独立更新/启动/停止每项服务。存储在队列中的邮件将被保留,并在处理包再次启动时进行处理。
答案 1 :(得分:1)
使用Wire-Tap可以做到这一点。如下图所示
<route id="initialRequest">
<from uri="bean:webService" />
<to uri="database:saveData" />
<wireTap uri="activemq:queue:queueName" />
...continue your respond send process
</route>
<route id="BackgroundLongProcess">
<from uri="activemq:queue:queueName" />
... Do the required time consuming process
</route>
然后BackgroundLongProcess将执行,但initialRequest路由不会等到BackgroundLongProcess进程完成。您可以参考camelone文档了解更多详情。