Apache camel ApacheCamel消息多路复用器集成模式
我正在尝试确定使用ApacheCamel和Spring将来自两个hornetq代理实例的消息流组合成单个流进行处理的最佳方法。这本质上与骆驼模式相反;但我需要的不是一对多,而是多对一。一个想法是使用组件实现此功能: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
<?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问题,这可能是阅读此问题的任何人都感兴趣的。