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

Implement counter variable in camel route

我正在尝试从数据库中获取员工详细信息列表并使用 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)
    ...

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

此政策有效:

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

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

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