Java 聚合程序

Java 聚合程序,java,apache-camel,Java,Apache Camel,我正在努力学习更多关于ApacheCamel的知识。我发现这些文档有些帮助,但对于那些不知道小代码段应该如何容易地适合于完全功能的程序的初学者来说,这留下了很多猜测。希望大多数人都知道我想描述什么。在一些编程书籍中,代码段显示在完全运行的程序的上下文之外,我还丢失了很多其他的东西 无论如何,这是我的程序,由于某种原因,它不会聚合消息。我希望它能聚合我所有的信息,但这个程序没有这样做。运行程序时,我收到一个空文件作为输出,这不是我的目标 package laser.helmet.camel.fri

我正在努力学习更多关于ApacheCamel的知识。我发现这些文档有些帮助,但对于那些不知道小代码段应该如何容易地适合于完全功能的程序的初学者来说,这留下了很多猜测。希望大多数人都知道我想描述什么。在一些编程书籍中,代码段显示在完全运行的程序的上下文之外,我还丢失了很多其他的东西

无论如何,这是我的程序,由于某种原因,它不会聚合消息。我希望它能聚合我所有的信息,但这个程序没有这样做。运行程序时,我收到一个空文件作为输出,这不是我的目标

package laser.helmet.camel.friend;

import org.apache.camel.builder.RouteBuilder;

public class AggregatingMessagesRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:start")
                .aggregate().constant(true)
                .completionTimeout(100L)
                .groupExchanges()
                .to("file:target/this_folder/result?allowNullBody=true");
    }

}
然后我从下面的类调用这个程序,当然它有
main
方法

package laser.helmet.camel.friend;

import org.apache.camel.CamelContext;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.ProducerTemplate;

public class Main {

    public static void main(String[] args) throws Exception { 
        CamelContext c = new DefaultCamelContext();
        c.addRoutes(new AggregatingMessagesRoute());
        ProducerTemplate pt = c.createProducerTemplate();

        c.start();

        pt.sendBody("direct:start", "1");
        pt.sendBody("direct:start", "2");
        Thread.sleep(5000);
        c.stop();
    }

}
我原以为我用
ProducerTemplate
创建的两条消息的正文在路由完成后都会出现在文件中,但它只是一个空白文件。我不得不将part
allowNullBody=true
添加到路由中,因为在运行这个程序时,由于某种原因,主体是空的

如果你是一个初学者,并且想知道。我使用Maven引入依赖项,而不是将camel.jar放在Java类路径上

谢谢大家阅读这篇文章D

那么,我如何开始聚合消息?0_o

和平


user_loser

这是一个简单的例子,因为您提供了代码片段,很好! 删除.groupExchanges(),因为它已被弃用,而且很难满足需要。您始终需要AggregationStrategy对如何聚合您的交换进行细粒度控制。因此,添加以下类:

class StringAggregationStrategy implements AggregationStrategy {

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        if (oldExchange == null) {
            return newExchange;
        }

        String oldBody = oldExchange.getIn().getBody(String.class);
        String newBody = newExchange.getIn().getBody(String.class);
        oldExchange.getIn().setBody(oldBody + "+" + newBody);
        return oldExchange;
    }
}
然后在你的路线中引用它;所以它变成了这样:

public class AggregatingMessagesRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:start")
                .aggregate().constant(true)
                .completionTimeout(100L)
                .aggregationStrategy(new StringAggregationStrategy())
                .to("file:target/this_folder/result?allowNullBody=true");
    }

}
希望这有帮助


R.

这是一个简单的问题,因为您提供了代码片段,很好! 删除.groupExchanges(),因为它已被弃用,而且很难满足需要。您始终需要AggregationStrategy对如何聚合您的交换进行细粒度控制。因此,添加以下类:

class StringAggregationStrategy implements AggregationStrategy {

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        if (oldExchange == null) {
            return newExchange;
        }

        String oldBody = oldExchange.getIn().getBody(String.class);
        String newBody = newExchange.getIn().getBody(String.class);
        oldExchange.getIn().setBody(oldBody + "+" + newBody);
        return oldExchange;
    }
}
然后在你的路线中引用它;所以它变成了这样:

public class AggregatingMessagesRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("direct:start")
                .aggregate().constant(true)
                .completionTimeout(100L)
                .aggregationStrategy(new StringAggregationStrategy())
                .to("file:target/this_folder/result?allowNullBody=true");
    }

}
希望这有帮助


R.

太棒了。这确实有效。在源代码中提供导入语句可能会有所帮助。我知道这一点,但比我更粗鲁的人可能会如此困惑,他们在书呆子般的愤怒中跳楼。感谢Ramin提供的快速专家帮助:D:)我很高兴这对你有帮助!令人惊叹的。这确实有效。在源代码中提供导入语句可能会有所帮助。我知道这一点,但比我更粗鲁的人可能会如此困惑,他们在书呆子般的愤怒中跳楼。感谢Ramin提供的快速专家帮助:D:)我很高兴这对你有帮助!如果你投了反对票,请提供理由。不过,成为一个拘谨的势利小人并不是一个合理的理由。感谢您对这个小评论的关注。:)我投了赞成票来平衡你的意见,这是一个非常好的问题,我打赌这将在未来帮助很多人。如果你投了反对票,请提供理由。不过,成为一个拘谨的势利小人并不是一个合理的理由。感谢您对这个小评论的关注。:)我投了更高的票来平衡这一点,这是一个非常好的问题,我打赌这将在未来帮助很多人。