我需要一个交换属性值,我在分裂后更新处理器如,
.process(new Processor() {
exchange.setProperty("recordNumber", 0);
}
})
.split(body(), new PreservePropertyonSplitAggregationStrategy())
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
int recordNumber = (int) exchange.getProperty("recordNumber"); //I need updated value on each split iteration
if(type1RecordList.get(i).getSagaiDossierNumber().equals(type1RecordList.get(i+1).getSagaiDossierNumber())) {
exchange.setProperty("recordNumber", i+1); //Iam updating this recordNumber based on condition }
}
})
.end();
//分叉
//这里是我的AggregationStrategy
public class PreservePropertyonSplitAggregationStrategy implements AggregationStrategy {
@SuppressWarnings("unchecked")
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
int recordNumber = (int) newExchange.getProperty("recordNumber");
if (oldExchange == null) {
newExchange.setProperty("recordNumber", recordNumber);
return newExchange;
}
else {
recordNumber = (int) oldExchange.getProperty("recordNumber");
oldExchange.setProperty("recordNumber", recordNumber);
return oldExchange;
}
}
}
请帮助。
在AggeregationStrategy中,我从新的交换器获得更新的值,但无法在下一个连续的处理器中获得相同的值。
由于split为每个元素创建了一个新的exchange,并从父exchange中复制了exchange属性,因此需要使用引用类型而不是值类型。对于整型,您可以使用AtomicInteger
或创建自己的包装器类来保存整型值。
from("direct:test")
.setProperty("recordNumber").exchange(ex -> new AtomicInteger(0))
.split(body())
.process(ex -> {
AtomicInteger recordNumber = ex.getProperty("recordNumber", AtomicInteger.class);
recordNumber.set(recordNumber.get() + 1);
ex.setProperty("recordNumber", recordNumber);
})
.log("Split: ${exchangeProperty.recordNumber}")
.end()
.log("Result: ${exchangeProperty.recordNumber}")
;
如果你只需要拆分元素的索引,你可以使用CamelSplitIndex属性,camel会自动为每个拆分元素设置该属性。
Split最适用于包含您希望单独处理的项的列表。例如,您可能有一个ID列表,您希望使用它从REST-API获取更多数据。但是对于基本循环,通常使用自定义处理器和普通java更简单。