简体   繁体   中英

How to get exchange property updated in processor upon each splitting iteration

I need a exchange property value which Iam updating in processor after split Like,

.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();

//split ends

//Here is my 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;
        }   
    }       
}

Kindly help.

In AggeregationStrategy am getting updated value from new exchange but unable get the same in the next consecutive processor.

Since split creates a new exchange for each element and copies exchange properties from the parent exchange you'll need to use reference type instead of value type. For integer you could use AtomicInteger or create your own wrapper class to hold your integer value.

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}")
;

If you just need index of the split element you can just use the CamelSplitIndex property which camel automatically sets for each split element.

Split works best with lists that contain items that you want to process individually. For example you might have list of ID's which you want to use to fetch more data from a REST-API. But for basic loops it's generally simpler to just a custom processor and plain java.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM