我使用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")而没有运气。
我如何获得容器?
答案 0 :(得分:1)
您需要在其中一个配置类上使用@EnableJms
。
你需要一个jmsListenerContainerFactory
bean。
您可以使用JmsListenerEndpointRegistry
bean停止和启动容器。
答案 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) {
}
}