【问题标题】:Apache Camel: can a direct endpoint run routes in parallel?Apache Camel:直接端点可以并行运行路由吗?
【发布时间】:2017-03-10 16:06:56
【问题描述】:

在我的 Camel 应用程序中,有 2 个 CXF 端点由相同的处理路由处理,AFAIK 每个端点可能会根据传入的 HTTP 请求并行生成 Exchange。
两个端点使用direct: 组件通过相同的路由转发请求,该组件有时被描述为调用方法的Camel等价物。

direct: 组件在生产者发送消息交换时提供对任何消费者的直接、同步调用。

我的问题:

  • direct: 组件是否并行运行不同的请求? (每个请求都有自己的 Exchange 并由不同的 java Thread 执行)
  • 如果不是,如何并行处理 CXF 请求?

这是我的情况:

<route id="CxfRoute1">
    <from uri="cxf:bean:endpoint1" />
    <to uri="direct:handle" />
</route>

<route id="CxfRoute2">
    <from uri="cxf:bean:endpoint2" />
    <to uri="direct:handle" />
</route>

<route id="HandleStuffRoute" />
    <from uri="direct:handle" />
    <to uri="bean:stuffHandler" />
</route>

【问题讨论】:

  • 2 个请求如何同时到达您的路线?我想,即使在 TCP 级别,也会有某种队列。听起来它总是一次执行一个 CXF 端点。
  • 它们在 TCP 级别可能是顺序的,在执行/线程级别可能是并行的。我不想在一个请求完成处理之前阻止。

标签: apache-camel cxf


【解决方案1】:

它就像一个直接的方法调用,例如 Foo foo = ... ; foo.callSomeMethod() 使用当前线程调用。因此,在此示例 CXF 中,您从消费者那里获得了并行,因此如果 2 个以上的客户端同时调用 CXF,则每个调用都在自己的线程中运行,并且每个调用都作为直接方法调用直接调用,所有这些都可以并行运行.

【讨论】:

    【解决方案2】:

    在你的情况下是的,它应该并行运行不同的请求。

    您可能可以创建一个骆驼单元测试来测试它。在您的路由测试类中,您可以创建一个基于计时器的新路由,然后创建一些虚拟主体并像这样调用您的路由端点:

     .parallelProcessing().to("cxf1", "cxf2", "cxf3")
    

    然后观察结果。

    我猜另一种方法是使用 JMeter 并针对您的 cxf 端点创建一个测试并观察。

    【讨论】:

    • 感谢您的建议!我正在考虑检查源代码,但没有足够的时间:-(
    【解决方案3】:

    要以与使用直接相同的方式处理并行请求,您可以改用“seda”。详情http://camel.apache.org/seda

    【讨论】:

    • 我认为 seda 队列不起作用,因为在继续处理之前我需要从路由返回的主体。
    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多