You need to enable JavaScript to run this app. Spring Boot集成Apache Camel时StateBean状态丢失问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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或者外部存储,有两种可行写法:

  1. 你最终采用的注入后通过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))
       }
    }
  1. 也可以直接把注入的StateBean实例传入method方法,写法如下:
// 先注入单例StateBean
@Autowired
private StateBean stateBean;

// 路由中filter写法调整为传入实例,而非类对象
.filter(method(stateBean, "doProcess"))

两种写法本质都是复用Spring管理的单例StateBean,状态都会在内存中正常保留。

内容的提问来源于stack exchange,提问作者miroana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 10:15:05