1

我正在使用 Camel ActiveMQ 组件生成 ActiveMQ 实例:

<camel:log message="YMA_IN" />
<camel:inOnly uri="activemqBroker:queue:queue.test" id="activemqBrokerTestQueue"/>
<camel:log message="YMA_OUT" />

端点上唯一的 jms 配置是 TTL 和池连接工厂。

<amq:connectionFactory id="jmsConnectionFactory" brokerURL="${config.jms.broker.url}" />

<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
    <property name="maxConnections" value="15" />
    <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory"/>
    <property name="timeToLive" value="${config.jms.time.to.live}" />
</bean>

<!-- Broker configuration -->
<bean id="activemqBroker" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig"/>
</bean>  

如果经纪人倒闭,交易所将继续停留在唯一(登录但不退出),似乎无限期地直到经纪人备份。没有例外,没有超时等...

如果经纪人倒闭,这是预期的行为吗?我期待一个例外?我缺少一些配置吗?

骆驼 2.10.1

4

3 回答 3

1

还有使用同步发送的选项,然后客户端将更快地检测到错误(并且不必等待超时)并能够抛出 Camel 可以检测到的异常。见一些细节

于 2013-08-17T08:07:45.633 回答
0

事实上,这似乎是预期的行为:需要在代理 URL 本身上配置超时。

以下答案显示了如何配置它:

https://stackoverflow.com/a/15416704/609452

然后一个简单的尝试/捕获 JMSException 就可以了

于 2013-08-16T14:18:24.617 回答
0

有了这个配置,一旦 ActiveMQ 代理出现故障,我就让 Camel 发送失败消息:

    ActiveMQConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory();
    mqConnectionFactory.setUseAsyncSend(true);
    mqConnectionFactory.setCloseTimeout(closeTimeout);
    mqConnectionFactory.setBrokerURL(brokerUrl);
    mqConnectionFactory.setUserName(userName);
    mqConnectionFactory.setPassword(password());

    PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory();
    pooledConnectionFactory.setMaxConnections(maxConnections);
    pooledConnectionFactory.setConnectionFactory(mqConnectionFactory);

    JmsConfiguration jmsConfiguration = new JmsConfiguration();
    jmsConfiguration.setConnectionFactory(pooledConnectionFactory);
    jmsConfiguration.setTransacted(false);

    ActiveMQComponent amqComponent = new ActiveMQComponent();
    amqComponent.setConfiguration(jmsConfiguration);
于 2019-06-05T20:24:31.423 回答