camel并行如何自定义聚合AggregationStrategy

camel支持并行执行路由,如:

<to uri="bean:camelBean?method=mutiA"/>
<multicast>
    <!-- 并行执行mutiB、mutiC -->
    <to uri="bean:camelBean?method=mutiB"/>
    <to uri="bean:camelBean?method=mutiC"/>
</multicast>
<to uri="bean:camelBean?method=mutiD"/>

在执行mutiD方法之前,必须等待mutiB与mutiC方法都执行完毕时才会执行,在camel中如果路由并行执行,那么会自动复制之前exchange的消息,也就是说mutiB与mutiC的exchange对象属于两个,而mutiA与mutiD中的exchange对象属于同一个,所以如果在mutiB与mutiC中修改了exchange对象中的值,在mutiD方法中是无法获取到的,但是camel提供了聚合方法,聚合的意思是在mutiB方法与mutiC方法执行完毕时,触发聚合方法,在聚合方法中可将mutiB与mutiC中的exchange对象的值传入给mutiD中的excahnge。这样就可以在mutiD中获取了并行路由中的值。

如何自定义聚合策略

在spring配置文件中添加bean

<!-- 自定义聚合 -->
<bean id="myStrategy" class="com.xiaoka.camel.spring.aggregationStrategy.MyAggregationStrategy" />
import org.apache.camel.Exchange;
import org.apache.camel.processor.aggregate.AggregationStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 聚合策略
 * 
 * @author liuchengbiao
 *
 */
public class MyAggregationStrategy implements AggregationStrategy {

    private static Logger logger = LoggerFactory.getLogger(MyAggregationStrategy.class);

    // @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        logger.info("自定义聚合...");
        if (oldExchange == null) {
            return newExchange;
        } else {
            String body1 = oldExchange.getIn().getBody(String.class);
            String body2 = newExchange.getIn().getBody(String.class);
            // 合并
            String merged = (body1 == null) ? body2 : body1 + "," + body2;
            logger.info("自定义聚合后的数据:" + merged);
            oldExchange.getOut().setBody(merged);
            return oldExchange;
        }
    }

}

在aggregate方法中自定义实现即可。

如何让camel识别到聚合策略

需要在 multicast 中添加 strategyRef 属性

<to uri="bean:camelBean?method=mutiA"/>
<multicast strategyRef="myStrategy">
    <!-- 并行执行mutiB、mutiC -->
    <to uri="bean:camelBean?method=mutiB"/>
    <to uri="bean:camelBean?method=mutiC"/>
</multicast>
<to uri="bean:camelBean?method=mutiD"/>

这样就完成了聚合策略

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌级-小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值