Camel Blueprint中Bean路由级别作用域的实现需求及代码咨询
嘿,这个需求在Apache Camel里完全能实现,我给你分享两种靠谱的做法,看哪种更适配你的开发场景~
方法一:Blueprint XML配置(对应你当前的XML写法)
默认情况下,Blueprint里的Bean是单例的,要实现路由级别的隔离,我们需要两步操作:
- 先把Bean的作用域改成
prototype,这样容器每次请求Bean时都会创建新实例; - 在路由调用Bean的URI里加上
?scope=route参数,让Camel在同一路由内缓存这个实例,确保同路由内复用,不同路由则新建。
修改后的代码片段如下:
<bean id="testbean" class="testClass" scope="prototype"/> <camelContext id="test" xmlns="http://camel.apache.org/schema/blueprint"> <route id="1"> <from uri="timer://foo?period=5000"/> <!-- 加上scope=route参数,指定路由级别作用域 --> <to uri="bean:testbean?scope=route"/> </route> <route id="2"> <from uri="timer://bar?period=3000"/> <to uri="bean:testbean?scope=route"/> </route> </camelContext>
这样配置后,路由1和路由2会各自拥有一个testClass的实例,而同一个路由里多次调用bean:testbean时,都会用同一个实例。
方法二:Java DSL + 注解方式(如果后续转Java开发可以用)
要是你用Java DSL写路由,直接用Camel的@Bean注解指定作用域更直观:
public class MyRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { // 路由1 from("timer://foo?period=5000") .bean(TestBean.class); // 路由2 from("timer://bar?period=3000") .bean(TestBean.class); } // 明确指定Bean作用域为路由级别 @Bean(scope = BeanScope.ROUTE) public TestBean testBean() { return new TestBean(); } }
这里BeanScope.ROUTE会让Camel自动给每个路由分配独立的TestBean实例,同路由内复用,完全符合你的需求。
小提醒
不管用哪种方式,都要确保你的Bean类要么是无状态的,要么状态是路由隔离的,避免不同路由的实例互相干扰哦~
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

