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),该参数指定要将哪个标头值从旧交换复制到新交换。
据我所知,公共 Exchange 聚合(方法不允许传入旧和新交换以外的参数。
解决方案
解决方案 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);
推荐阅读
- python - 如何在 Python 中编写正则表达式以删除字符串中间数字的前导零
- generics - 如何创建一个采用 u32 或 &str 并分别返回 u32 或 usize 的闭包?
- python - 用列中的混合字符替换特定字符串
- python - Pandas Dataframe groupby 重叠
- python - 我在 vsc 和 windows 10 中的烧瓶中创建数据库时遇到问题。有人可以帮助解决这个问题吗?
- c# - 如何正确调整 Datagrid 的大小以打印 C# 表单
- android - 使用rxjava时如何取消慢发射
- php - Yii 使用 Field 对 gridview 进行排序
- javascript - 检查值是否存在于另一张表中
- reactjs - Twilio flex UI 获取工作人员属性并仅向管理员显示 sideNav 按钮