Apache 骆驼豆状态丢失
Apache camel bean state is lost
我有路线
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
,或者没有
外部来源(即数据库)
其他注意事项
我正在使用
阿帕奇骆驼 3.10.0
spring-boot 2.5
更新 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))
}
}
问题是您没有共享特定的 bean 实例,因为调用 bean(StateBean.class, ...) 应该创建所需 class 的 bean 的新实例
你应该使用 .beanRef("name-of-the-bean", ....)
我有路线
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
,或者没有
外部来源(即数据库)
其他注意事项
我正在使用
阿帕奇骆驼 3.10.0
spring-boot 2.5
更新 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))
}
}
问题是您没有共享特定的 bean 实例,因为调用 bean(StateBean.class, ...) 应该创建所需 class 的 bean 的新实例
你应该使用 .beanRef("name-of-the-bean", ....)