首页 > 解决方案 > 骆驼聚合策略

问题描述

我正在使用 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),该参数指定要将哪个标头值从旧交换复制到新交换。

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

标签: apache-camel

解决方案


解决方案 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);

推荐阅读