如何停止和启动jms监听器

时间:2017-02-07 09:40:16

标签: java spring jms listener spring-jms

我使用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")而没有运气。

我如何获得容器?

3 个答案:

答案 0 :(得分:1)

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

你需要一个jmsListenerContainerFactory bean。

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

请参阅the Spring documentation

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我使用了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;
}

在SomeFacade.java中调用

public class SomeFacade {

@Autowired
JmsListenerEndpointRegistry someUpdateListener;

public void stopSomeUpdateListener() {
  MessageListenerContainer container = someUpdateListener.getListenerContainer("someUpdateListener");
  container.stop();
  }


public void startSomeUpdateListener() {
  MessageListenerContainer container = someUpdateListener.getListenerContainer("someUpdateListener");
  container.start();
  }
}

SomeService.java中的JmsListener实现

public class SomeService {

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