从Guava Event Bus调用Camel端点报错:找不到EventBus Bean求助
你遇到的异常原因很清晰,主要是两个核心问题导致的:路由引用的EventBus名称和你注册的不一致,而且在Spring Boot环境下,你用SimpleRegistry注册EventBus的方式不被Spring容器识别,所以Camel找不到对应的Bean。下面一步步给你解决:
1. 先修正路由端点名称的匹配问题
你代码里把EventBus注册为busName,但路由配置里写的是guava-eventbus:camelTest,两者名称完全不匹配,这是最直接的错误。先把路由里的端点名称改成和注册的一致:
from("guava-eventbus:busName").to("seda:queue");
2. 在Spring Boot中正确注册EventBus为Spring Bean
在Spring Boot环境下,Camel默认会使用Spring的ApplicationContext作为Bean注册表,而不是你手动创建的SimpleRegistry。所以你需要把EventBus注册成一个标准的Spring Bean,而不是自己放到SimpleRegistry里。
方式一:通过@Bean注解注册(推荐)
在你的Spring Boot配置类(比如主Application类或者专门的Camel配置类)里添加Bean注册:
@Bean(name = "busName") public EventBus eventBus() { return new EventBus(); }
方式二:手动关联Spring容器注册
如果你需要自己创建CamelContext,那得把Spring的ApplicationContext关联进去,而不是用SimpleRegistry:
@Autowired private ApplicationContext applicationContext; public void initCamel() throws Exception { EventBus eventBus = new EventBus(); // 把EventBus注册到Spring容器中 applicationContext.getAutowireCapableBeanFactory().registerSingleton("busName", eventBus); SpringCamelContext camel = new SpringCamelContext(applicationContext); // 添加路由配置 camel.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("guava-eventbus:busName").to("seda:queue"); } }); camel.start(); // 发送测试事件 eventBus.post("Send me to the SEDA queue."); }
3. 完整修正后的代码示例
这里给你一个完整的Spring Boot整合示例,确保所有环节都正确:
import com.google.common.eventbus.EventBus; import org.apache.camel.builder.RouteBuilder; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication public class App { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(App.class, args); // 从Spring容器获取注册好的EventBus并发送事件 EventBus eventBus = context.getBean("busName", EventBus.class); eventBus.post("Send me to the SEDA queue."); } @Bean(name = "busName") public EventBus eventBus() { return new EventBus(); } @Bean public RouteBuilder routeBuilder() { return new RouteBuilder() { @Override public void configure() throws Exception { from("guava-eventbus:busName") .log("Received event content: ${body}") .to("seda:queue"); } }; } }
为什么原来的方式行不通?
在Spring Boot整合Camel的场景下,如果你用DefaultCamelContext(SimpleRegistry)初始化,这个CamelContext并不会和Spring的ApplicationContext关联。而Camel的Guava EventBus组件默认会从Spring的Bean注册表中查找EventBus实例,你手动放到SimpleRegistry里的对象Spring完全看不到,自然就会抛出NoSuchBeanException。
内容的提问来源于stack exchange,提问作者Ashok

