Apache骆驼豆状态丢失

时间:2021-05-29 14:50:47

标签: java spring-boot apache-camel

我有路线

    from("timer://poller?fixedRate=true&period=1500")
            .routeId("db-poller")
            .filter(method(StateBean.class, "doProcess"))
            .to("direct:ready-to-process").end();

     from("direct:ready-to-process")
            .bean(StateBean.class, "setDoProcess(false)");

我的 StateBean 看起来像这样

@Component
public class StateBean {

    private final AtomicBoolean process =
            new AtomicBoolean(true);

    public boolean doProcess() {
        return process.get();
    }

    public void setDoProcess(boolean state) {
        process.set(state);
    }

}

我期望 bean 将进程状态保留为 false,但在第二个循环中 出于某种原因,状态恢复为真。我做错了什么?

注意事项

这条路线,但是如果我使 process 变量静态

有没有办法让它在没有静态字段 process 的情况下工作,或者没有 外部来源(即 DB)

其他注意事项

我正在使用

Apache Camel 3.10.0

弹簧启动 2.5

更新 NO.1

为了完整的解决方案,感谢 Luca Burgazzoli 我做了这样的事情

@Component
public class MyRoute extends RouteBuilder {

    private StateBean state;

    @Autowired
    public MyRoute(StateBean state) {
        this.state = state;
    }

    @Override
    public void configure() {
    
    from("timer://poller?fixedRate=true&period=1500")
            .routeId("db-poller")
            .filter(exchange -> state.doProcess())
            .to("direct:ready-to-process").end();

     from("direct:ready-to-process")
            .process(exchange -> state.setDoProcess(false))
            .process(...)
            .process(...)
            .split(...)
            .streaming()
            .to(...)
            .process(exchange ->  state.setDoProcess(true))
       }
    }

1 个答案:

答案 0 :(得分:1)

问题是您没有共享特定的 bean 实例,因为调用 bean(StateBean.class, ...) 应该创建所需类的 bean 的新实例

你应该使用类似 .beanRef("name-of-the-bean", ....)