【问题标题】:Apache Camel - JMS inonly behaviour when broker downApache Camel - 代理关闭时的 JMS 唯一行为
【发布时间】:2013-08-18 20:19:47
【问题描述】:

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

【问题讨论】:

    标签: jms activemq apache-camel


    【解决方案1】:

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

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

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

    然后对 JMSException 进行简单的 try/catch 即可

    【讨论】:

      【解决方案2】:

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

      查看一些详细信息

      【讨论】:

        【解决方案3】:

        有了这个配置,一旦 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-10
          • 1970-01-01
          • 1970-01-01
          • 2013-04-14
          • 1970-01-01
          • 2019-05-20
          相关资源
          最近更新 更多