Java 如何停止和启动jms侦听器

Java 如何停止和启动jms侦听器,java,spring,jms,listener,spring-jms,Java,Spring,Jms,Listener,Spring Jms,我使用的是Spring,我有一个JMS队列将消息从客户端发送到服务器。我想在服务器关闭时停止发送消息,并在服务器备份时重新发送 我知道以前有人问过,但我不能让它工作。我创建了一个JmsListener并给了它一个ID,但我无法获取它的容器来停止\启动它 @Resource(name="testId") private AbstractJmsListeningContainer _probeUpdatesListenerContainer; public void testSendJms() {

我使用的是Spring,我有一个JMS队列将消息从客户端发送到服务器。我想在服务器关闭时停止发送消息,并在服务器备份时重新发送

我知道以前有人问过,但我不能让它工作。我创建了一个JmsListener并给了它一个ID,但我无法获取它的容器来停止\启动它

@Resource(name="testId")
private AbstractJmsListeningContainer _probeUpdatesListenerContainer;

public void testSendJms() {

    _jmsTemplate.convertAndSend("queue", "working");
}

@JmsListener(destination="queue", id="testId")
public void testJms(String s) {
    System.out.println("Received JMS: " + s);

}
容器bean永远不会被创建。我还尝试从上下文中获取它,或者使用@Autowired和@Qualifier(“testId”),但没有成功


如何获取容器?

您需要在一个配置类上使用
@EnableJms

您需要一个
jmsListenerContainerFactory
bean

您可以使用
JmsListenerEndpointRegistry
bean停止和启动容器


请参阅。

如果在项目中使用
CachingConnectionFactory
,则需要在停止和重新启动之间调用
resetConnection()
方法,否则旧的物理连接将保持打开状态,并在重新启动时重新使用。

我使用了JmsListenerEndpointRegistry。这是我的例子。我希望这会有所帮助

JmsConfiguration.java中的Bean配置。我更改了默认的自动启动选项

@Bean(name="someQueueScheduled")
public DefaultJmsListenerContainerFactory odsContractScheduledQueueContainerFactory() {
   DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
   ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(someActiveMQ);
   Map<String, Class<?>> typeIds = new HashMap<>();
   typeIds.put(SomeDTO);
   factory.setMessageConverter(messageConverter(Collections.unmodifiableMap(typeIds)));
    factory.setPubSubDomain(false);
    factory.setConnectionFactory(cf);
    factory.setAutoStartup(false);
    return factory;
}
SomeService.java中的JmsListener实现

public class SomeService {

 @JmsListener(id = "someUpdateListener",
      destination = "${some.someQueueName}",
      containerFactory ="someQueueScheduled")
  public void pullUpdateSomething(SomeDTO someDTO)  {
  }
}

我自动连接了JmsListenerEndpointRegistry,并使用ID
\u listenerContainer=\u JmsListenerEndpointRegistry.getListenerContainer(“listener\u container\u ID”)从中获取了容器请注意,无法在后构造中检索容器。。
public class SomeService {

 @JmsListener(id = "someUpdateListener",
      destination = "${some.someQueueName}",
      containerFactory ="someQueueScheduled")
  public void pullUpdateSomething(SomeDTO someDTO)  {
  }
}