嗨Camel / jms开发人员。 使用Apache Camel amqp jms连接器。并作为经纪人ActiveMQ。
我的配置是非常默认的。
这是消费者代码示例:
public static void main(String[] args) throws Exception {
AMQPComponent amqpComponent = AMQPComponent.amqpComponent(HOST, USER, PWD);
CamelContext context = new DefaultCamelContext();
context.addComponent("amqp", amqpComponent);
context.start();
context.addRoutes(new RouteBuilder() {
@Override
public void configure() {
from("amqp:queue:1test.queue?transacted=true")
.to("stream:out")
.end();
}
});
Thread.sleep(20*1000);
context.stop();
}
很容易看到,我已经配置了事务处理的使用者。 1test.queue。 当我运行它时,在日志中查看:
[main]信息org.apache.camel.impl.DefaultCamelContext-路线:route1已启动并从以下地点使用:amqp:// queue:1test.queue?transacted = true
[AmqpProvider:(1):[amqp:HOST2]]信息org.apache.qpid.jms.sasl.SaslMechanismFinder-SASL身份验证的最佳匹配是:SASL-PLAIN
[AmqpProvider:(1):[amqp:HOST2]] INFO org.apache.qpid.jms.JmsConnection-连接ID:...:1已连接到远程代理:amqp:HOST2
[AmqpProvider:(2):[amqp:HOST2]]信息org.apache.qpid.jms.sasl.SaslMechanismFinder-SASL身份验证的最佳匹配是:SASL-PLAIN
[AmqpProvider:(2):[amqp:HOST2]]信息org.apache.qpid.jms.JmsConnection-连接ID:...:2已连接到远程代理:amqp:HOST2
[AmqpProvider:(3):[amqp:HOST2]]信息org.apache.qpid.jms.sasl.SaslMechanismFinder-SASL身份验证的最佳匹配是:SASL-PLAIN
[AmqpProvider:(3):[amqp:HOST2]]信息org.apache.qpid.jms.JmsConnection-连接ID:...:3已连接到远程代理:amqp:HOST2
如果我从消费者中删除?transacted = true
[AmqpProvider:(1):[amqp:HOST2]]信息org.apache.qpid.jms.sasl.SaslMechanismFinder-SASL身份验证的最佳匹配是:SASL-PLAIN
[AmqpProvider:(1):[amqp:HOST2]] INFO org.apache.qpid.jms.JmsConnection-连接ID:...:1已连接到远程代理:amqp:HOST2
它只出现一次。
如何解释这种行为?这通常是骆驼交易的消费者吗?
谢谢。
P.S已选中this topic,但不确定如何将其映射到骆驼现实。
答案 0 :(得分:2)
AMQP Camel Component尚未定义池化连接工厂,因此它正在为每次迭代创建一个新连接以检查代理中是否有消息。
为避免这种情况,您应该将AMQPComponent的CachingConnectionFactory定义为:
import org.apache.camel.component.amqp.AMQPComponent;
import org.apache.camel.component.jms.JmsConfiguration;
import org.apache.qpid.jms.JmsConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jms.connection.CachingConnectionFactory;
@Bean
public JmsConnectionFactory jmsConnectionFactory() {
JmsConnectionFactory jmsConnectionFactory = new JmsConnectionFactory(brokerUser, brokerPassword, brokerUrl);
return jmsConnectionFactory;
}
@Bean
@Primary
public CachingConnectionFactory jmsCachingConnectionFactory(JmsConnectionFactory jmsConnectionFactory) {
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(jmsConnectionFactory);
return cachingConnectionFactory;
}
@Bean
public JmsConfiguration jmsConfig(CachingConnectionFactory cachingConnectionFactory) {
JmsConfiguration jmsConfiguration = new JmsConfiguration();
jmsConfiguration.setConnectionFactory(cachingConnectionFactory);
jmsConfiguration.setCacheLevelName("CACHE_CONSUMER");
return jmsConfiguration;
}
@Bean
public AMQPComponent amqpComponent(JmsConfiguration jmsConfiguration) {
AMQPComponent amqpComponent = new AMQPComponent();
amqpComponent.setConfiguration(jmsConfiguration);
return amqpComponent;
}
您将获得与JMS Camel Component相同的行为。
AMQP Camel Component页上的更多信息
答案 1 :(得分:0)
使用由amqp插入的jms。
我有类似的问题。但是,当我使用JMS代替AMQP时,它运行良好,只有一次记录日志,即创建了单个连接。
AMQ组件似乎存在一些问题。
谢谢, 拉胡尔