HornetQ Reconnect-попытки не работают с DefaultMessageListenerContainer

1

Я настроил весну для прослушивания jms для использования сообщений из 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 я found that the DefaultMessageListenerContainer class sets the default recovery time to 5seconds could not find queue in warn mode every 5seconds. which я 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]
Теги:
jms
spring-jms
hornetq

1 ответ

2
Лучший ответ

Однако я ожидаю, что параметры восстановления будут рассмотрены на фабрике соединений, а попытки восстановления - на 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 ограничить количество восстановлений, но вам должно быть достаточно легко перейти от DefaultMessageListenerContainer и создать собственное расширение recoverAfterListenerSetupFailure. Вы можете повторять несколько раз, и если это не работает, вы можете вызвать stop на контейнере, чтобы перестать слушать эту очередь. Это означает, что если брокер терпит неудачу и возобновит работу через 20 минут или около того, ваш слушатель больше не будет включен...

  • 0
    Есть ли другой вариант, например, использование SimpleMessageListenerContainer или делегаторов?
  • 0
    Я не понимаю ваш вопрос.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню