我使用部署在 ActiveMQ 服务中的 Apache Camel 模块。
鉴于我使用 Spring DSL,并且文件routeContext
中有路由定义(实现为)FilteringRouteContext.xml
(简化):
<routeContext id="filteringRouteContext" xmlns="http://camel.apache.org/schema/spring">
<route id="myFilteringRoute">
<from uri="direct:filteringRoute"/>
<idempotentConsumer messageIdRepositoryRef="idempotentRepository" skipDuplicate="false">
<simple>${header.JMSType}</simple>
<filter>
<property>CamelDuplicateMessage</property>
<stop/>
</filter>
</idempotentConsumer>
</route>
</routeContext>
接下来,我在其他 XML 文件(简化)中配置了 Camel Context:
<import resource="classpath:FilteringRouteContext.xml"/>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<routeContextRef ref="filteringRouteContext"/>
<route id="myRoute1">
<from uri="activemq:topic:source1" />
<to uri="direct:filteringRoute" />
<to uri="activemq:topic:target1" />
</route>
<route id="myRoute2">
<from uri="activemq:topic:source2" />
<to uri="direct:filteringRoute" />
<to uri="activemq:topic:target2" />
</route>
<route id="myRoute3">
<from uri="activemq:topic:source3" />
<to uri="direct:filteringRoute" />
<to uri="activemq:topic:target3" />
</route>
</camelContext>
<bean id="idempotentRepository"
class="org.apache.camel.processor.idempotent.MemoryIdempotentRepository">
<property name="cacheSize" value="10"/>
</bean>
我希望共享路由(带有 id= myFilteringRoute
)从filteringRouteContext
声明为,使用 IoC 术语,每个依赖实例,因此来自单个 Camel 上下文(带有 id= myRoute1
,myRoute2
,myRoute3
)的每条路由都应该使用它自己的共享路由实例(带有 id = myFilteringRoute
),具有单独的内部状态、bean 实例等。
换句话说,来自 Camel Context 的每条路由(带有 id= myRoute1
, myRoute2
, myRoute3
)不应该使用相同的共享路由实例(带有 id= myFilteringRoute
),而应该有自己完全独立的实例(具有完全分离的内部状态和 bean 实例)
请考虑我的共享路由(带有 id= myFilteringRoute
)可能会使用更多的 bean,它们可能有不同的范围(singleton
,prototype
等request
)。
我的问题是:我可以使用单个 Camel 上下文来实现这个目标,还是需要将我的路线(使用 id= myRoute1
, myRoute2
, myRoute3
)放在单独的 Camel 上下文中?我的问题的最佳解决方案是什么?
如果我使用多个 Camel 上下文,并且每个上下文都使用 bean 与 ActiveMQ ( org.apache.activemq.camel.component.ActiveMQComponent
) 或其他消耗内部或系统资源的 bean 通信,是否会对性能产生重要影响?
或者使用 Java DSL 而不是 Spring DSL 来解决我的问题可能更好?
谢谢你。