【问题标题】:For Apache Camel, is it possible to have half of a route synchronous and the second half async?对于 Apache Camel,是否可以有一半的路由同步和另一半异步?
【发布时间】:2016-04-10 05:32:36
【问题描述】:

我目前有一个暴露 cxf 端点的骆驼路线。当消息通过端点时,我会首先使用来自另一个 Web 服务的一些信息来丰富该消息,然后再进行更多处理。但是,我想让这条路由的前半部分同步,这样我就可以向调用我暴露的 cxf 端点的任何人发回响应。

路线看起来像这样:

from(cxf:CxfEndpoint)
    .process(someProcessing)
    .to(cxf:ExternalCxfEndpoint)
    .to(activemq:queue:somequeue)

//return a response back to caller here

from(activemq:queue:somequeue)
    ... //additional processing here
    ...

这是因为当消息通过我暴露的 cxf 端点发送时,我不知道它是否是有效消息。我需要首先使用消息丰富来验证它。消息丰富后,我希望让发送消息的人知道他们的消息已被接受,但不希望他们等待消息通过整个路由,因为这可能需要几个小时。

有谁知道这是怎么回事?

提前致谢!

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    我相信您只需将 exchangePattern 设置为 InOnly 也就是将其设为 Event Message。这应该让您的路由不等待 ActiveMQ 的回复。当骆驼交换来自网络服务时,它将默认为 InOut,就像您的情况一样。

    Camel 开发人员here 的回答的相关问题。

    另请参阅this one,了解有关您的代理关闭时的行为的一些详细信息。

    【讨论】:

    • 那么如果我在中途将路由从 InOut() 更改为 InOnly() 为什么会发生呢?消息中的任何内容都会立即返回到回调位置并且消息会正常进行吗?
    • 仅仅设置交换模式本身并不能做任何事情,但它会影响之后调用的端点的行为。您可以并且在您的情况下应该仅使用 InOnly 模式调用 activeMQ 端点,因此不会等待来自代理的响应。但是,你真的应该尝试一下,因为我自己没有做过,所以这只是一个理论。
    • 我一定会用一个基本的路线来试试这个。谢谢!
    【解决方案2】:

    是的,100% 可能。一个简单的例子是这样的:

    1. 来自 cxf 端点

    2. 将您的请求存储在骆驼属性或标头中

    3. 到 xslt - 为 cxf 端点生成 xslt - 同步流

    4. 使用 set body 重置您的原始负载。

    5. Wiretap Endpoint - 到下游的任何端点甚至是路由,这变成异步的。这不会参与上述同步响应。

    注意 - 步骤 2 和 4 可能不需要,这取决于您的用例。

    你可以做很多事情,我只是举了一个非常简单的例子。它也不需要是窃听,但窃听帮助我们不编写任何额外的自定义异常处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多