首页 > 解决方案 > 在骆驼路线中实现计数器变量

问题描述

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

     });

我什至尝试使用处理器来设置和获取属性值,但它没有奏效。有什么办法可以让我对成功和失败记录进行计数器。

标签: javaspringapache-cameldslspring-camel

解决方案


属性是交换的本地属性,因此您可能需要使用路由策略来注入全局计数器。

创建路由策略:

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

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


推荐阅读