【问题标题】:HornetQ Reconnect-attempts not working with DefaultMessageListenerContainerHornetQ 重新连接尝试无法与 DefaultMessageListenerContainer 一起使用
【发布时间】:2014-04-25 17:16:17
【问题描述】:

我已经为 jms 监听器配置了 spring 来使用来自 hornetQ 的消息,如下所示。

<bean name="connectionFactory" class="com.kp.jms.KPHornetQJMSConnectionFactory"
    destroy-method="close">
    <constructor-arg name="ha" type="boolean" value="false" />
    <constructor-arg>
        <array>
            <ref bean="transportConfiguration"></ref>
        </array>
    </constructor-arg>
    <property name="maxRetryInterval" value="10000" />
    <property name="reconnectAttempts" value="10" />
    <property name="retryInterval" value="5000" />
    <property name="retryIntervalMultiplier" value="2" />
    <property name="initialConnectAttempts" value="10" />
</bean>

<bean name="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory"></property>
</bean>


<bean name="kpJmsDelegator"
    class="com.kp.KPDelegator">
    <property name="jmsTemplate" ref="jmsTemplate"></property>
</bean>


<jms:listener-container connection-factory="connectionFactory"
    concurrency="1"  >
    <jms:listener destination="kpQueue" ref="kpJmsDelegator"
        method="onMessage" />
</jms:listener-container>

当 hornetq 服务器启动并运行时,代码可以正常工作。但是,当我启动应用程序并且没有启动我得到的 hornetq 时,could not find queue in warn mode every 5seconds. which I found that the DefaultMessageListenerContainer class sets the default recovery time to 5seconds。但是,我希望从连接工厂考虑恢复设置,并使用恢复尝试 10 次,如果仍然无法连接,则重新连接导致手动重新启动服务器,如果 jms 重新激活。由于不考虑重新尝试,因此我的日志被错误消息轰炸。我不确定我哪里出错了,有人能指出我在做什么错吗?

这是堆栈跟踪

014-04-24 18:27:27,159 [org.springframework.jms.listener.DefaultMessageListenerContainer#1-227] WARN  o.s.j.l.DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 'snmpQueue' - trying to recover. Cause: There is no queue with name kpQueue
javax.jms.JMSException: There is no queue with name snmpQueue
    at org.hornetq.jms.client.HornetQSession.createQueue(HornetQSession.java:407) ~[hornetq-jms-2.2.21.Final.jar:2.2.21.SNAPSHOT (HQ_2_2_21_final, 122)]
    at org.springframework.jms.support.destination.DynamicDestinationResolver.resolveQueue(DynamicDestinationResolver.java:101) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.support.destination.DynamicDestinationResolver.resolveDestinationName(DynamicDestinationResolver.java:66) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.support.destination.JmsDestinationAccessor.resolveDestinationName(JmsDestinationAccessor.java:100) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:221) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1119) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1095) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1088) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:985) ~[spring-jms-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_32]

【问题讨论】:

    标签: java jms hornetq spring-jms


    【解决方案1】:

    但是我希望从连接工厂考虑恢复设置,并使用恢复尝试 10 次

    这两个属性都不是ConnectionFactory 合约的一部分,所以DefaultMessageListenerContainer 无法解决这个问题。

    您可以按如下方式重写配置以使用 10 秒的恢复间隔:

    <jms:listener-container connection-factory="connectionFactory"
                            concurrency="1" recovery-interval="10000">
        <jms:listener destination="kpQueue" ref="kpJmsDelegator"
                      method="onMessage" />
    </jms:listener-container>
    

    没有办法限制恢复的数量,但您应该很容易从DefaultMessageListenerContainer 扩展并创建自己的recoverAfterListenerSetupFailure 扩展。您可以重试多次,如果这不起作用,您可以在容器上调用 stop 以停止侦听该队列。这意味着如果代理失败并在 20 分钟左右后恢复,您的侦听器将不再启用...

    【讨论】:

    • 有没有其他选择,比如使用 SimpleMessageListenerContainer 或委托者?
    • 我不明白你的问题。
    • 我在问除了 DefaultMessageListenerContainer 之外是否还有其他类可以设置重试尝试限制。我尝试使用 SimpleMessageListenerContainer 但应用程序启动失败并出现 bean 创建错误。
    • 就像我在回答中已经说过的那样,目前没有这样的功能。我会更新我的答案以明确说明
    • 是的......够公平............非常感谢............将在springframework中提升JIRA。 ........同时,我将扩展 DefaultMessageListenerContainer 并尝试解决此问题。非常感谢您的意见
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2011-12-05
    • 2018-10-21
    • 2021-11-22
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多