Apache camel ApacheCamel消息多路复用器集成模式

Apache camel ApacheCamel消息多路复用器集成模式,apache-camel,Apache Camel,我正在尝试确定使用ApacheCamel和Spring将来自两个hornetq代理实例的消息流组合成单个流进行处理的最佳方法。这本质上与骆驼模式相反;但我需要的不是一对多,而是多对一。一个想法是使用组件实现此功能: <?xml version="1.0" encoding="UTF-8"/> <beans xmlns="..." xmlns="..."> <!-- JMS Connection 1 --> <bean id

我正在尝试确定使用ApacheCamel和Spring将来自两个hornetq代理实例的消息流组合成单个流进行处理的最佳方法。这本质上与骆驼模式相反;但我需要的不是一对多,而是多对一。一个想法是使用组件实现此功能:

<?xml version="1.0" encoding="UTF-8"/>
<beans xmlns="..."
       xmlns="...">

    <!-- JMS Connection 1 -->
    <bean id="jndiTemplate1" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                ...Connection 1 Specific Information...
            </props>
        </property>
    </bean>
    <bean id="jmsTopicConnectionFactory1" 
          class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate1"/>
        </property>
        <property name="jndiName">
            <value>java:jms/RemoteConnectionFactory</value> 
        </property>
    </bean>
    <bean id="jms1" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="jmsTopicConnectionFactory1"/>
    </bean>

    <!-- JMS Connection 2 -->
    <bean id="jndiTemplate2" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                ...Connection 2 Specific Information...
            </props>
        </property>
    </bean>
    <bean id="jmsTopicConnectionFactory2" 
          class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate2"/>
        </property>
        <property name="jndiName">
            <value>java:jms/RemoteConnectionFactory</value> 
        </property>
    </bean>
    <bean id="jms2" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="jmsTopicConnectionFactory2"/>
    </bean>

    <!-- Camel route many to 1 using direct component -->
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route id="hornetQ_broker_1">
            <from uri="jms1:topic:testTopic1">
            <to uri="direct:process_message">
        </route>
        <route id="hornetQ_broker_2">
            <from uri="jms2:topic:testTopic2">
            <to uri="direct:process_message">
        </route>
        <route id="message_processor">
            <from uri="direct:process_message">
            <log message="message_processor received message">
        </route>
    </camelContext>
</beans>

…连接1特定信息。。。
java:jms/RemoteConnectionFactory
…连接2特定信息。。。
java:jms/RemoteConnectionFactory
问题:当需要多->1集成模式时,是否建议使用上述方法?如果存在多个Apache Camel解决方案,每种方法的关键性能影响是什么?

运行时环境:

  • HornetQ经纪人是JBoss EAP6
  • 部署到FuseSource 4.4.1的驼峰上下文
  • 每个实体都存在于单独的服务器/jvm上
注:

  • hornetQ代理实例无法群集
  • hornetQ代理实例不包含重复数据

    • 我认为您的方法适用于您的场景。但是,如果您在不同的JVM中运行,可能direct不是您需要使用的组件

      内部队列有不同的组件:Direct、Direct VM、SEDA、VM、Disruptor。。。但我相信,如果您在JVM中运行,所有这些都是正确的(如果您只是在同一个上下文中运行,则其中一些是正确的)。有关更多信息:


      如果要在不同的JVM中使用不同的上下文,则需要使用不同的组件。

      感谢您的回答。在本例中,示例spring配置将部署到FuseSource,我相信所有camel对象都将在同一JVM下执行。阅读了您提供的链接后,Direct和SEDA似乎是此部署类型的适用组件。您对问题的第二部分有什么意见吗?在本例中,这是我在选择同步(直接)和异步(SEDA)行为时应该考虑的因素。我想说,这取决于您预期的负载。但我会选择有多个消费者的轿车。我已经用过了,效果非常好,所以当你希望收到少量的信息时,使用direct组件;预计交通拥挤时,是否使用SEDA组件?按照逻辑,jms1和jms2将分别是一个消费者(多个消费者==期望大量的消息流量)?SEDA使用多个线程来处理消息,这使得它更适合于当您有大量负载时使用大型消息的场景。我不会说你的陈述在每种情况下都是正确的,但这很可能是我要做的。我看到已经有一个关于堆栈溢出的直接vs SEDA问题,这可能是阅读此问题的任何人都感兴趣的。