Apache Camel?transacted = true

时间:2018-08-08 09:19:35

标签: java apache-camel jms activemq amqp

嗨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,但不确定如何将其映射到骆驼现实。

2 个答案:

答案 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组件似乎存在一些问题。

谢谢, 拉胡尔