骆驼聚合策略

时间:2018-12-03 14:58:12

标签: apache-camel

我正在使用AggregationStrategy来确保在oldExchange中填充了特定的标头... *一切正常...当前* ...当前代码为:


.enrich("direct:step1-processing", new AggregationStrategy() {<br/>
   @Override<br/>
      public Exchange aggregate(final Exchange oldExchange, <br/>
                                final Exchange newExchange) {<br/>
       copyHeader(SomeBean.SpecificHeader_1, <br/>
                     newExchange, <br/>
                     oldExchange);<br/>
          return oldExchange;<br/>
      }<br/>
     })

.enrich("direct:step2-processing", new AggregationStrategy() {<br/>
    @Override<br/>
      public Exchange aggregate(final Exchange oldExchange, <br/>
                                final Exchange newExchange) {<br/>
       copyHeader(SomeBean.SpecificHeader_2, <br/>
                     newExchange, <br/>
                     oldExchange);<br/>
          return oldExchange;<br/>
      }<br/>
     })

void copyHeader(final String headerName, <br/>
                final Exchange newExchange, <br/>
                final Exchange oldExchange) {<br/>
        oldExchange.getIn().setHeader(
             headerName, <br/>
             newExchange.getIn().getHeader(headerName));<br/>
}

我的目标是将AggregationStrategy代码移到其自己的类中,而不是将代码内联。那本身不是问题,问题是如何传递该参数( SomeBean.SpecificHeader_1或SomeBean.SpecificHeader_2 ),该参数指定将哪个头值从旧交易所复制到新交易所。

据我所知,公共交易所聚合()方法不允许传入新旧交易所以外的参数。

1 个答案:

答案 0 :(得分:0)

解决方案1:定义自己的策略

对于每个特定的标头,您可以有一个AggregationStrategy的单独实例:

public class MyAggregationStrategy implements AggregationStrategy {

    private String headerName;

    public MyAggregationStrategy(String headerName) {
        this.headerName = headerName;
    }

    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        copyHeader(newExchange, oldExchange);
        return oldExchange;
    }

    void copyHeader(final Exchange newExchange,
                    final Exchange oldExchange) {
        oldExchange.getIn().setHeader(
                headerName,
                newExchange.getIn().getHeader(headerName));
    }

}

然后使用以下策略:

.enrich("direct:step1-processing", new MyAggregationStrategy(SomeBean.SpecificHeader_1))
.enrich("direct:step2-processing", new MyAggregationStrategy(SomeBean.SpecificHeader_2))

解决方案2:使用lambda的

稍微修改了您原来的copyHeaders()方法:

Exchange copyHeader(final String headerName,
                final Exchange newExchange,
                final Exchange oldExchange) {
    oldExchange.getIn().setHeader(
            headerName,
            newExchange.getIn().getHeader(headerName));
    return oldExchange;
}

然后定义所需的策略:

AggregationStrategy header1Strategy = (oldExchange, newExchange) -> copyHeader("my-header-1", oldExchange, newExchange);
AggregationStrategy header2Strategy = (oldExchange, newExchange) -> copyHeader("my-header-2", oldExchange, newExchange);

最后使用它们:

.enrich("direct:step1-processing", header1Strategy)
.enrich("direct:step2-processing", header2Strategy);