【问题标题】:Camel route with independent message queue reader带有独立消息队列阅读器的骆驼路线
【发布时间】:2017-01-18 11:12:40
【问题描述】:

我有一个带有 Web 服务接口的应用程序,它在 JBoss FUSE 上使用骆驼开发,我正在将接收到的消息保存到数据库中,没有任何问题。但是现在我需要对其进行增强以执行一些耗时的过程,例如 Web 服务调用。

我的想法是将接收消息添加到 MessageQueue 中,然后发送 Web 服务调用响应。然后通过读取消息队列来完成耗时的过程。但我的问题是是否有可能在骆驼中运行后台路由来执行这样的实现。

我尝试使用多播来实现它,但在那里它一直在等待所有路由完成。

下图显示了我尝试归档的内容。

我的问题是是否可以在完成路线 2 之前从路线 1 发送响应?如果可能的话,我如何使用 camel 归档它?

我对 Camel 开发很陌生,我想知道是否可以完成上述场景。请善意地提供有关此的反馈?

【问题讨论】:

  • 如果为了清晰起见重新措辞或包含您想到的流程图表,这将很有帮助。听起来您正在尝试通过调用第二个 Web 服务并将原始和第二个 Web 服务响应组合在一起,然后再保存到数据库来进行丰富。请澄清——是在第二次 Web 服务调用之前还是之后保存到数据库? db 调用是否需要来自原始调用和第二次调用的数据?图表会很有帮助。
  • 我的想法是将初始Web服务请求的请求消息保存到数据库中,并将该消息添加到ActiveMQ,然后发送Web服务的响应。然后在后台运行路由来读取 ActiveMQ 队列并做一些耗时的过程,例如 web 服务和更新数据库。我也将图表添加到问题中。感谢您的回复
  • 查看Wire Tap EIP

标签: apache-camel activemq jbossfuse


【解决方案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 路由中,body 将被发送到 ActiveMQ 队列。这通常是一个快速操作。
BackgroundLongProcess 路由将由 ActiveMQ 队列异步触发,您的处理可能需要更长的时间。

在我的示例中,我将正文发送到 ActiveMQ 并直接对其进行处理,您可以发送数据库主键并在处理之前从 DB 重新加载数据。

然后,您可以在 2 个不同的包中开发您的应用程序,一个用于处理 HTTP 部分,一个用于后台处理。这将提高模块化,您可以独立更新/启动/停止每个服务。队列中存储的消息将被持久化并在处理包再次启动时进行处理。

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

【讨论】:

  • 感谢您的解决方案和解释。更多地了解骆驼真的很有帮助。但我需要将它归档在单个包中。
  • @casper 此解决方案适用于单个捆绑包和多个捆绑包。路由之间的通信使用 ActiveMQ 进行。我建议阅读“Camel in Action”和“OSGi in Action”书籍。
【解决方案2】:

可以使用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文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多