我使用部署在ActiveMQ服务内部的Apache Camel模块。
假设我使用Spring DSL并且在FilteringRouteContext.xml
文件(简化版)中有路由定义(实现为RouteContext
):
<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文件(简化)中配置了骆驼上下文:
<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>
我希望使用IoC术语将来自FilteringRouteContext
的共享路由(ID=MyFilteringRoute
)声明为每个依赖项的实例,因此来自单个骆驼上下文(ID=MyRoute1
、MyRoute2
、MyRoute3
)的每条路由都应该使用该共享路由的自己的实例(ID=MyFilteringRoute
),具有单独的内部状态和bean实例等。
换句话说,来自骆驼上下文的每个路由(ID=MyRoute1
,MyRoute2
,MyRoute3
)不应该使用共享路由的同一个实例(ID=MyFilteringRoute
),而应该有自己完全分开的实例(内部状态和bean实例完全分开)
请考虑我的共享路由(id=myfilteringroute
)可能使用更多bean,这些bean可能具有各种作用域(singleton
、prototype
、request
等)。
我的问题是:是否可以使用单个Camel上下文来实现此目标,或者是否需要将路由(id=MyRoute1
、MyRoute2
、MyRoute3
)放置在单独的Camel上下文中?我的问题最好的解决办法是什么?
如果我使用多个Camel上下文,并且每个上下文都使用bean与ActiveMQ(org.apache.ActiveMQ.Camel.component.activeMQComponent
)或其他消耗内部或系统资源的bean通信,是否会对性能产生重要影响?
或者使用Java DSL而不是Spring DSL更好地解决我的问题?
谢谢你。
当前的Camel Spring DSL定义是由JAXB在解封XML时创建的。这些定义帮助骆驼运行时构建处理器并组装它们以路由消息。这样,routeContextRef就与您提到的作用域无关了。
但是对于Spring使用bean元素创建的bean,如果愿意,您可以定义作用域,如果camel Spring DSL中有bean引用,则camel只需从Spring应用程序上下文中获取作用域。
为了回答您的问题,routeContextRef只是给出了一种跨camel上下文共享路由定义实例的方法,如果您不想共享它们的实例,则需要在不同的spring应用程序上下文中创建camel上下文,该上下文可以保存Routecontext的不同实例。
我的Apache骆驼项目开始有一个相当好的结构,但我陷入了困境,因为我的routeContext中的路由无限执行。我的所有路由都使用SQL组件,我希望所有路由只执行一次。 我发现,当我的routeContext中有两条路由时,两条路由都只执行一次,但是一旦我添加了第三条路由(不管第三条路由是什么),camel就开始无限执行所有路由。我所有的路由都导致sql插入,因此相同的路由运行多次会导致重复键错
我正在将CSV文件输入集成到一个更大的系统中,我想对其进行设置,以便将CSV中未正确解析的各行(由)发送到医院队列,并将所有其他工作行转换为一个对象并聚合到一个列表中。但是,我很难将
我在MyRouteBuilder中有一条骆驼路线。正在使用ActiveMQ消息的java文件: 我写了一个测试用例如下: 当我运行单元测试用例时,我得到了这个奇怪的错误: 看到这些信息,我尤其感到困惑: 和 虽然我有一个正确的队列名称,但为什么队列显示为?还有,为什么代理url? 我想运行这个单元测试用例,以便它在所有环境中正常运行,如:本地、DIT、SIT、PROD等。因此,我不能负担的经纪人u
我正在尝试使用多部分/表单数据将文件上传到骆驼路由。一切都很好,但是,我无法获得原始文件名。骆驼版本是:3.14.1 更新 使用对路由的以下修改进行更新。我设法处理二进制文件(获取文件名并存储它们)。但是,对于文本文件,该文件将附加边界页脚: 路线定义: 先谢谢你了 爱德华
我能够使用canmel路由定义中的以下uri从sftp目录成功下载一个/所有文件: 下载所有文件 下载一个文件 我的要求是下载特定的文件列表= one.text,two.text。 如何将文件名列表传递到骆驼路由?最好是我正在寻找一个解决方案,我可以在其中指定如下内容
我正在研究spring MVC,并使用Apache camel来集成外部服务。我想使用Apache Camel route进行Webservice调用。 就像我的本地REST服务(http://localhostsmiliex.xx:8080/users)从外部REST服务获取数据(http://xxx:000/users)并希望通过路由获取外部数据。 哪个Apache组件适合Jetty或prod