繁体   English   中英

Apache Camel?transacted = true

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM