具有独立消息队列的骆驼路线 reader
Camel route with independent message queue reader
我有一个带有 Web 服务接口的应用程序,它是在 JBoss FUSE 上使用 camel 开发的,我将接收到的消息毫无问题地保存到数据库中。但现在我需要增强它来完成一些耗时的过程,例如 Web 服务调用。
我的想法是将接收到的消息添加到 MessageQueue 中,然后发送 Web 服务调用响应。然后通过读取消息队列来完成耗时过程。但我的问题是是否有可能在骆驼中使用后台路由 运行 来实现这样的实现。
我尝试使用多播来实现它,但它在那里等待所有路由完成。
下图显示了我尝试存档的内容。
我的问题是是否可以在完成路由 2 之前从路由 1 发送响应?如果可能的话,我该如何使用骆驼将其存档?
我是 Camel 开发的新手,我想知道是否可以实现上述场景。请提供有关此的反馈?
绝对有可能。这是一个例子:
<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 部分,一个执行后台处理。这将提高模块化,您可以 update/start/stop 每个服务独立。存储在队列 中的消息将被保留 并在处理包再次启动时进行处理。
可以使用 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 文档了解更多详细信息。
我有一个带有 Web 服务接口的应用程序,它是在 JBoss FUSE 上使用 camel 开发的,我将接收到的消息毫无问题地保存到数据库中。但现在我需要增强它来完成一些耗时的过程,例如 Web 服务调用。
我的想法是将接收到的消息添加到 MessageQueue 中,然后发送 Web 服务调用响应。然后通过读取消息队列来完成耗时过程。但我的问题是是否有可能在骆驼中使用后台路由 运行 来实现这样的实现。
我尝试使用多播来实现它,但它在那里等待所有路由完成。
下图显示了我尝试存档的内容。
我的问题是是否可以在完成路由 2 之前从路由 1 发送响应?如果可能的话,我该如何使用骆驼将其存档?
我是 Camel 开发的新手,我想知道是否可以实现上述场景。请提供有关此的反馈?
绝对有可能。这是一个例子:
<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 部分,一个执行后台处理。这将提高模块化,您可以 update/start/stop 每个服务独立。存储在队列 中的消息将被保留 并在处理包再次启动时进行处理。
可以使用 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 文档了解更多详细信息。