在骆驼路线中实现计数器变量

问题描述

我正在尝试从数据库获取员工详细信息列表,并使用REST API将其推入外部系统。我可以为上述流程创建路线。

我还想知道已创建和失败记录的数量。所以我通过将属性设置为0来创建一个计数器,然后增加属性的值。当我尝试增加属性值时,它始终与初始化的值相同。

 from("direct:test")
    .setBody(constant("select name as name,location as location,mobile as mobile from employee"))
    .to("jdbc:testdb")
    .process(exchange ->{
        // Custom Logic which will convert list of Employee  Details
    })
    .split(body())
    .setProperty("successrec",simple("0"))
    .setProperty("failurerec",simple("0"))
    .doTry()
    .setProperty("successrec",simple("${property.successrec++}"))
    .to("http://test/upload/employee")
    .doCatch((Exception.class)).process( exchange ->{   
        
        Integer failureRecords=exchange.getProperty("failurerec",Integer.class);
        exchange.setProperty("failurerec",failureRecords++);

     });

我什至尝试使用处理器来设置和获取属性值,但这没有用。我有什么办法可以对成功和失败的记录进行反驳。

解决方法

属性对于交易所而言是本地的,因此您可能需要使用Route Policy来注入全局计数器。

创建路由策略:

class MyRoutePolicy extends RoutePolicySupport {
    private AtomicInteger counter = new AtomicInteger();

    @Override
    public void onExchangeBegin(Route route,Exchange exchange) {
        exchange.setProperty("counter",counter);
    }

    public int getCounter() {
        return counter.get();
    }
};

将策略与路由相关联:

MyRoutePolicy policy = new MyRoutePolicy();

from("direct:test")
    .routePolicy(policy)
    ...

这是可能的解决方案之一,但是您也可以根据需要使用全局计数器,该计数器可能更简单。