繁体   English   中英

HornetQ重新连接尝试与DefaultMessageListenerContainer一起使用

[英]HornetQ Reconnect-attempts not working with DefaultMessageListenerContainer

我已经为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 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]

但是我期望从连接工厂考虑恢复设置,并使用恢复尝试进行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分钟左右后恢复,则将不再启用您的监听器...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM