Запуск и остановка прослушивателя JMS с помощью Spring

Итак, вопрос в том, как временно остановить и запустить прослушиватель jms, созданный с помощью spring, используя fallowing:

<amq:connectionFactory id="exampleJmsFactory" brokerURL="tcp://${jms.broker.url}" />

<jms:listener-container concurrency="1" connection-factory="exampleJmsFactory"  destination-type="queue" message-converter="exampleMessageConverter">
        <jms:listener destination="incoming.example.client.queue" ref="exampleProductsMessageConsumer" method="consume"/>
</jms:listener-container>


<bean id="exampleProductsMessageConsumer" class="com.unic.example.jms.receive.JmsExampleProductsMessageConsumer" scope="tenant"/>

Итак, в основном, в чем проблема. У нас есть механизм init/update, который клиент может запустить в любое время, и во время этого init/update я хочу прекратить потребление любых сообщений, потому что система непригодна для использования в это время, и если сообщение пришло, оно будет потеряно.

Итак, как я могу остановить прослушиватель или контейнер прослушивателя или все подключение с помощью API. Я обнаружил, что класс AbstractJmsListeningContainer имеет stop / start, но как я могу его получить ? Я не имею в виду ничего из этого jms: listener и listener-containers имеют имя или что-то в этом роде.

3 ответов


вы можете назначить идентификатор контейнеру-прослушивателю. Затем получите ссылку на него, либо позвонив getBean, либо получив его инъекцию. Это даст вам AbstractJmsListeningContainer, на котором вы можете вызвать start / stop.


Да, это делает трюк.

<jms:listener-container concurrency="1" connection-factory="exampleJmsFactory"  destination-type="queue" message-converter="exampleMessageConverter">
        <jms:listener id="exampleProductsMessageListener" destination="incoming.example.client.queue" ref="exampleProductsMessageConsumer" method="consume"/>
</jms:listener-container>



DefaultMessageListenerContainer exampleProductsMessageListener= Registry.getApplicationContext().getBean("exampleProductsMessageListener", DefaultMessageListenerContainer.class);
exampleProductsMessageListener.stop();

вы также можете получить доступ к messageListenerContainer и вызвать stop () на нем:

@javax.annotation.Resource //autowire by name
 private AbstractJmsListeningContainer myMessageListenerContainer;

 myMessageListenerContainer.stop();

 I'm using the more verbose setup of this container:
 <bean id="myMessageListenerContainer" class="org.springframework.jms.listener.DefaultMes sageListenerContainer">
 <property name="connectionFactory" ref="jmsConnectionFactory"/>
 <property name="destination" ref="myQueue"/>
 <property name="messageListener" ref="myListener"/>
 <property name="autoStartup" value="true" />
 </bean>

здесь вы видите, что вы можете установить autoStartup в false, если вы не хотите, чтобы listenerContainer автоматически запускался.