具有独立消息队列的骆驼路线 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 每个服务独立。存储在队列 中的消息将被保留 并在处理包再次启动时进行处理。

http://camel.apache.org/activemq.html

可以使用 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 文档了解更多详细信息。