Camel中Endpoint DSL与@EndpointInject配合的正确用法及端点不一致问题
问题原因与解决方案
这不是Camel的Bug,而是Endpoint DSL的默认行为差异导致的问题。当你使用Endpoint DSL的seda("STATUS_ENDPOINT")方法时,Camel会自动为端点生成完整格式的URI:seda://STATUS_ENDPOINT;而你通过@EndpointInject注入的是简化格式的seda:STATUS_ENDPOINT,这两个URI在Camel中会被识别为两个完全独立的SEDA端点,对应两个不同的队列。
你的消息被发送到了没有路由消费的seda:STATUS_ENDPOINT队列,自然会被填满而无法传递到目标topic。下面是几个可行的解决方法:
方法一:注入时使用完整URI格式
直接匹配Endpoint DSL生成的完整URI,修改注入代码:
@Component public class StateChangePublisher { @EndpointInject(value="seda://STATUS_ENDPOINT") private ProducerTemplate producer; // 其他代码不变 }
方法二:在Endpoint DSL中显式指定简化URI
如果你更习惯使用seda:STATUS_ENDPOINT这种格式,可以在定义端点时强制指定URI,覆盖Endpoint DSL的默认生成规则:
@Component public class MyRoutes extends EndpointRouteBuilder { @Override public void configure() throws Exception { from(seda("STATUS_ENDPOINT").uri("seda:STATUS_ENDPOINT")) .routeId("stateChangeRoute") .to(activemq("topic:statusTopic")); } }
这样路由使用的端点和你注入的seda:STATUS_ENDPOINT就完全一致了。
方法三:通过端点ID引用(推荐)
这种方式更清晰,也避免了URI格式的歧义。先在路由中为SEDA端点设置ID:
@Component public class MyRoutes extends EndpointRouteBuilder { @Override public void configure() throws Exception { from(seda("STATUS_ENDPOINT").id("statusSedaEndpoint")) .routeId("stateChangeRoute") .to(activemq("topic:statusTopic")); } }
然后注入时通过ID引用该端点:
@Component public class StateChangePublisher { @EndpointInject(ref="statusSedaEndpoint") private ProducerTemplate producer; // 其他代码不变 }
以上三种方法都能解决你遇到的队列不匹配问题,推荐使用方法三,因为它更符合Spring/Camel的依赖注入最佳实践,也更易于维护。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

