gpt4 book ai didi

java - HornetQ 重新连接尝试无法与 DefaultMessageListenerContainer 一起使用

转载 作者:行者123 更新时间:2023-11-30 03:55:38 24 4
gpt4 key购买 nike

我已经为 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 时,每 5 秒无法在警告模式下找到队列。我发现 DefaultMessageListenerContainer 类将默认恢复时间设置为 5 秒。但是,我希望从连接工厂考虑恢复设置,并使用恢复尝试 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]

最佳答案

However I'm expecting the recovery settings to be considered from connection factory and use recovery attempts to be for 10times

这两个属性都不是 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 分钟左右恢复,您的监听器将不再启用...

关于java - HornetQ 重新连接尝试无法与 DefaultMessageListenerContainer 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23270113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com