8

所以问题是如何临时停止和启动使用 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 都没有名字或类似的东西。

4

3 回答 3

11

您可以为侦听器容器分配一个 id。然后通过调用 getBean 或将其注入来获取对它的引用。这将为您提供一个 AbstractJmsListeningContainer ,您可以在其上调用启动/停止。

于 2012-07-10T07:03:59.047 回答
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();
于 2012-07-10T10:40:10.377 回答
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。

于 2017-02-07T09:47:09.293 回答