[英]Apache Camel ?transacted=true
嗨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已连接到远程Broker:amqp:HOST2
[AmqpProvider:(2):[amqp:HOST2]]信息org.apache.qpid.jms.sasl.SaslMechanismFinder-SASL身份验证的最佳匹配是:SASL-PLAIN
[AmqpProvider:(2):[amqp:HOST2]] INFO 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已连接到远程Broker:amqp:HOST2
它只出现一次。
如何解释这种行为? 这通常是给骆驼交易的消费者吗?
谢谢。
PS检查了此主题,但不确定如何将其映射到Camel现实。
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骆驼组件页面上的更多信息
使用由amqp插入的jms。
我有类似的问题。 但是,当我使用JMS代替AMQP时,它运行良好,只有一次日志,即创建了单个连接。
似乎AMQ组件存在一些问题。
谢谢,拉胡尔
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.