Apache Camel - 当经纪人关闭时,JMS只有行为

时间:2013-08-16 12:12:38

标签: jms activemq apache-camel

我正在使用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>  

如果经纪人关闭,交易所仍然停留在inonly(登录但不是OUT),看似无限期,直到经纪人重新开始。没有例外,没有超时等...

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

Camel 2.10.1

3 个答案:

答案 0 :(得分:1)

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

了解一些细节

答案 1 :(得分:0)

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

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

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

然后一个简单的try / catch JMSException工作

答案 2 :(得分:0)

使用此配置,一旦ActiveMQ代理崩溃,我就让骆驼使消息失败:

    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);