如何在每次拆分迭代时在处理器中更新exchange属性



我需要一个交换属性值,我在分裂后更新处理器如,

.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更简单。

相关内容

  • 没有找到相关文章

最新更新