天天看点

Camel使用多个from()定义RouteDefinition1. 使用多个from创建路由2. 使用一个from创建多消费者的路由3. 多个from之间插入其他处理情形下的处理逻辑参考

Camel使用多个from定义RouteDefinition

  • 1. 使用多个from创建路由
  • 2. 使用一个from创建多消费者的路由
  • 3. 多个from之间插入其他处理情形下的处理逻辑
  • 参考

该方法是基于Camel Version 2.20.1。新版本已经不支持在一个路由中使用多个from。

1. 使用多个from创建路由

在一个RouteDefinition里可以定义多个from(),相当于创建多个消费者。

示例:创建一个路由,消费三个阻塞队列a, b, c的消息,并将消息内容输出到日志。

public class MultiFromRouteTest extends CamelTestSupport {
    @Test
    public void testMultiFrom() {
        template.sendBody("seda:a", "a");
        template.sendBody("seda:b", "b");
        template.sendBody("seda:c", "c");
        template.sendBody("seda:c", "cccc");
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("seda:a")
                	.from("seda:b")
                	.from("seda:c")
                	.log("receive message body ${body}");
            }
        };
    }
}
           

执行结果

Camel使用多个from()定义RouteDefinition1. 使用多个from创建路由2. 使用一个from创建多消费者的路由3. 多个from之间插入其他处理情形下的处理逻辑参考

2. 使用一个from创建多消费者的路由

可以使用一个from多个参数的形式实现上述功能,其路由定义如下:

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("seda:a", "seda:b", "seda:c").log("receive message body ${body}");
        }
    };
}
           

3. 多个from之间插入其他处理情形下的处理逻辑

如果在多个from()处理之间加入了其他处理,这些处理将作用于所有的from()。

下面的例子在 1. 的基础上稍微做了改造,在from(“seda:b”)后增加了日志输出处理,该日志输出同样适用于from(“seda:c”)。

public class MultiFromRouteTest extends CamelTestSupport {
    @Test
    public void testMultiFrom() throws InterruptedException {
        template.sendBody("seda:a", "a");
        template.sendBody("seda:b", "b");
        template.sendBody("seda:c", "c");
        template.sendBody("seda:c", "cccc");
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("seda:a").from("seda:b")
                        .log("receive message body ${body}")
                        .from("seda:c")
                        .log("receive message body ${body}");
            }
        };
    }
}
           

执行结果:阻塞队列 c 中的消息也被输出了2次。

Camel使用多个from()定义RouteDefinition1. 使用多个from创建路由2. 使用一个from创建多消费者的路由3. 多个from之间插入其他处理情形下的处理逻辑参考

参考

Is it possible to define a Camel route with multiple from(), i.e. consume from multiple endpoints?

继续阅读