Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Camel?事务处理=真_Java_Apache Camel_Jms_Activemq_Amqp - Fatal编程技术网

Java Apache Camel?事务处理=真

Java Apache Camel?事务处理=真,java,apache-camel,jms,activemq,amqp,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 D

嗨,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();
}
很容易看到,我已经配置了Transact-consumer。对于1测试队列。 当我运行它时,请在日志中查看:

[main]INFO org.apache.camel.impl.DefaultCamelContext-路由:route1从以下位置启动和使用:amqp://queue:1test.queue?transacted=true
[AmqpProvider:[amqp:HOST2]]INFO org.apache.qpid.jms.sasl.SaslMechanismFinder-sasl验证的最佳匹配为:sasl-PLAIN
[AmqpProvider:[amqp:HOST2]]INFO org.apache.qpid.jms.JmsConnection-连接ID:…:1连接到远程代理:amqp:HOST2
[AmqpProvider:[amqp:HOST2]]INFO org.apache.qpid.jms.sasl.SaslMechanismFinder-sasl验证的最佳匹配为:sasl-PLAIN
[AmqpProvider:(2):[amqp:HOST2]]INFO org.apache.qpid.jms.JmsConnection-连接ID:…:2连接到远程代理:amqp:HOST2
[AmqpProvider:[amqp:HOST2]]INFO org.apache.qpid.jms.sasl.SaslMechanismFinder-sasl验证的最佳匹配为:sasl-PLAIN
[AmqpProvider:(3):[amqp:HOST2]]INFO org.apache.qpid.jms.JmsConnection-连接ID:…:3连接到远程代理:amqp:HOST2

如果我从消费者中删除?Transact=true

[AmqpProvider:[amqp:HOST2]]INFO org.apache.qpid.jms.sasl.SaslMechanismFinder-sasl验证的最佳匹配为:sasl-PLAIN
[AmqpProvider:[amqp:HOST2]]INFO org.apache.qpid.jms.JmsConnection-连接ID:…:1连接到远程代理:amqp:HOST2

它只出现一次

如何解释这种行为?这通常适用于骆驼中的交易消费者

多谢各位


p.S已检查,但不确定如何将其映射到骆驼现实。

使用jms代替amqp

我也有类似的问题。但是当我使用JMS而不是AMQP时,它工作得很好,只创建了一次日志,即单个连接

似乎AMQ组件存在一些问题

谢谢,
Rahul

AMQP Camel组件尚未定义池连接工厂,因此它正在为每次迭代创建一个新连接,以检查代理中是否有消息

要避免这种情况,应将AMQP组件的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驼峰组件相同的行为

更多信息请参见第页