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