当前位置: 首页 > 知识库问答 >
问题:

单个骆驼上下文中的单独路由实例

姚信鸥
2023-03-14

我使用部署在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=MyRoute1MyRoute2MyRoute3)的每条路由都应该使用该共享路由的自己的实例(ID=MyFilteringRoute),具有单独的内部状态和bean实例等。

换句话说,来自骆驼上下文的每个路由(ID=MyRoute1,MyRoute2,MyRoute3)不应该使用共享路由的同一个实例(ID=MyFilteringRoute),而应该有自己完全分开的实例(内部状态和bean实例完全分开)

请考虑我的共享路由(id=myfilteringroute)可能使用更多bean,这些bean可能具有各种作用域(singletonprototyperequest等)。

我的问题是:是否可以使用单个Camel上下文来实现此目标,或者是否需要将路由(id=MyRoute1MyRoute2MyRoute3)放置在单独的Camel上下文中?我的问题最好的解决办法是什么?

如果我使用多个Camel上下文,并且每个上下文都使用bean与ActiveMQ(org.apache.ActiveMQ.Camel.component.activeMQComponent)或其他消耗内部或系统资源的bean通信,是否会对性能产生重要影响?

或者使用Java DSL而不是Spring DSL更好地解决我的问题?

谢谢你。

共有1个答案

阳航
2023-03-14

当前的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