所以问题是如何使用以下方式临时停止并启动使用spring创建的jms侦听器:
<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"/>
所以基本上是什么问题。我们确实有一个客户端可以随时运行的初始化/更新机制,并且在这个初始化/更新期间我想停止消耗任何消息,因为系统在这段时间内无法使用,如果有消息,它将丢失。
所以我如何使用API来停止监听器或监听器容器或整个连接。我发现一个类AbstractJmsListeningContainer有停止/启动但我怎么能得到它?我的意思是没有这个jms:listener和listener-containers有一个名字或类似的东西。
答案 0 :(得分:11)
您可以为侦听器容器分配ID。然后通过调用getBean或将其注入来获取对它的引用。这将为您提供一个AbstractJmsListeningContainer,您可以在其上调用start / stop。
答案 1 :(得分:6)
是的,这就是诀窍。
<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();
答案 2 :(得分:1)
您还可以获取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>
如果您不希望listenerContainer自动启动,您可以在此处将autoStartup设置为false。