如何用Camel提高效率?

时间:2014-02-23 20:14:28

标签: java multithreading apache-camel esper

我的项目使用Camel和Esper component有效率问题。

我有几个外部数据源向camel端点提供信息。接收数据的每个Camel端点都将其传输到处理它的路由,然后在Esper端点传送它。

下图说明了这种行为:

problem

效率问题是所有这些都是由一个Java线程完成的。因此,如果我有很多来源,那就有一个巨大的瓶颈。

以下代码准确说明了图片的内容:

public final void configure() throws OperationNotSupportedException{
    RouteDefinition route = from("xmpp://localhost:5222/?blablabla...");

    // apply some filter
    FilterDefinition filterDefinition = route.filter().method(...);

    // apply main processor
    ExpressionNode expressionNode = filterDefinition.process(...);


    // set destination
    expressionNode = filterDefinition.to("esper://session_X");
}

要解决此问题,我必须使用线程池或使用某种并行处理来处理这种情况。我不能使用多播,收件人列表等模式,因为所有这些都发送多个端点/客户端的相同消息,在我的示例中并非如此。

一个可能的解决方案是每个“Datasource endpoint - > Route - > Esper endpoint”组合有1个线程,如下图所示:

solution_1

另一种可能的解决方案是让1个线程从数据源接收所有内容,然后将其分配给多个线程,并与另一个端点一起处理路由处理:

solution_2

PS:我愿意接受您可能提出的任何其他建议。

为了实现其中一个我考虑使用Camel SEDA component组件,但是,这个似乎不允许我拥有动态线程池,因为concurrentConsumers属性是静态的。此外,我不确定是否可以使用SEDA端点,因为我相信(尽管我不完全确定)像.to("seda:esper://session_X?concurrentConsumers=10")这样的端点的语法对Camel无效。

所以,在这一点上,我很遗憾,我不知道该怎么做: - SEDA是我正在寻找的解决方案吗? - 如果是,在给定语法问题的情况下如何将其与Esper端点集成? - 还有其他解决方案/ Camel组件可以解决我的问题吗?

1 个答案:

答案 0 :(得分:2)

您必须定义一条单独的seda路由,将您的消息分发到esper引擎,例如(使用流畅的样式):

public final void configure() throws OperationNotSupportedException{
    from("xmpp://localhost:5222/?blablabla...")
        .filter().method(...)
        .process(...)
        .to("seda:sub");

    from("seda:sub?concurrentConsumers=10)
     .to("esper://session_X");
 }

尽管如此,只有在丢失消息不成问题时才应使用seda。否则,您应该使用更强大的协议,例如允许保留消息的jms

修改

seda旁边,您可以使用threads(),您可以通过定义ExecutorService来自定义线程行为:

public final void configure() throws OperationNotSupportedException{
    from("xmpp://localhost:5222/?blablabla...")
        .filter().method(...)
        .process(...)
        .threads()
        .executorService(Executors.newFixedThreadPool(2))
        .to("esper://session_X");
 }

如果您使用sedathreads(),则可能会在发生故障时失去交易安全性。对于这种情况,或者如果您需要将工作负载平衡到多个远程主机,您可以使用jms。有关此解决方案的更多信息,请参见here