什么是正确的方法,或决定何时杀死听众的流行惯例?我似乎无法在任何地方找到可靠的答案。我正在处理的队列是IBM的MQ队列,我通常知道你会读到2033错误代码(我公司在其他应用程序中执行此操作),此时你可以结束,但对于SpringBoot Jms应用程序这里的约定是什么?一旦队列为空,侦听器就会挂起,直到有更多消息到来。我知道如果我想要怎么杀它,但我怎么知道呢?
作为一个例子,这里是一个我投入的示例项目的配置
@Configuration
@EnableTransactionManagement
public class JmsConfig {
@Bean
protected DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory() throws JMSException {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(mqQueueConnectionFactory());
factory.setConcurrency("1");
factory.setSessionTransacted(true);
factory.setAutoStartup(true);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setErrorHandler(new JmsErrorHandler());
return factory;
}
@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory() {
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName(host);
try {
mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setCCSID(1208);
mqQueueConnectionFactory.setChannel(channel);
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(queueManager);
} catch (Exception e) {
e.printStackTrace();
}
return mqQueueConnectionFactory;
}
这里是听众
@Component
public class Consumer {
@JmsListener(id = "myQueue", destination = "queue")
public void processMessage(Message message) throws MQException, IOException {
try {
String messageString = ((TextMessage) message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
除了主类和ErrorHandler之外,它实际上是整个示例项目,它将处理消息。我在其他应用程序中所做的是实例化MQQueue
给定队列值并且只是简单的queue.getCurrentDepth()
如果我得到零我然后调用一个ListenerContainerController的实例然后从JmsListenerEndpointRegistry调用stop鉴于队列ID。
Spring是否有一种简单的沟通方式“嘿,你的队列现在是空的”,还是有办法在x时间过后结束它?
答案 0 :(得分:3)
JmsListener
用于在邮件到达目的地时接收和处理邮件。它不打算读取,直到目的地为空,然后停止,它被设计为继续运行。
相反,只需使用JmsTemplate
及其receive
方法来阅读消息,直到消息完成为止。然后处理它们并编写报告。
最终你甚至可以使用JmsItemReader
创建一个Spring Batch作业,这个读者将阅读,直到没有更多内容可读,然后它将全部结束。它下面还使用JmsTemplate
当你使用Spring Boot时,你可以做的是使用cron作业来每天触发这个工作(这基本上是启动你创建的jar)。另请参阅Spring Boot的参考指南,了解如何使用batch applications。