Spring Boot集成Apache Camel时StateBean状态丢失问题求助
问题根因
你最初的写法中,filter(method(StateBean.class, "doProcess")) 直接传入了类对象调用Camel的method方法,此时Apache Camel不会从Spring容器获取你标注了@Component的单例StateBean,而是每次执行该过滤逻辑时,都通过反射新建一个独立的StateBean实例。
所以你每次调用setDoProcess(false)修改的都是当次新建的实例的状态,下一次定时器触发时又会创建新的StateBean实例,其process的初始值就是true,就出现了你遇到的状态自动变回true的问题。
当你把process设为static变量时,该变量属于类层面的共享属性,所有StateBean实例共用同一个值,所以就符合运行预期。
无需static的解决方案
只要保证路由全程操作的是Spring容器中同一个StateBean单例即可,不需要依赖static或者外部存储,有两种可行写法:
- 你最终采用的注入后通过lambda调用的方案,是完全正确的:
@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(exchange -> state.setDoProcess(true)) } }
- 也可以直接把注入的StateBean实例传入method方法,写法如下:
// 先注入单例StateBean @Autowired private StateBean stateBean; // 路由中filter写法调整为传入实例,而非类对象 .filter(method(stateBean, "doProcess"))
两种写法本质都是复用Spring管理的单例StateBean,状态都会在内存中正常保留。
内容的提问来源于stack exchange,提问作者miroana
相关产品推荐
相关产品推荐

