当Queue没有消息时,确定何时在SpringBoot中终止Jms侦听器

时间:2017-07-13 17:42:55

标签: java spring-boot ibm-mq spring-jms

什么是正确的方法,或决定何时杀死听众的流行惯例?我似乎无法在任何地方找到可靠的答案。我正在处理的队列是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时间过后结束它?

1 个答案:

答案 0 :(得分:3)

JmsListener用于在邮件到达目的地时接收和处理邮件。它不打算读取,直到目的地为空,然后停止,它被设计为继续运行。

相反,只需使用JmsTemplate及其receive方法来阅读消息,直到消息完成为止。然后处理它们并编写报告。

最终你甚至可以使用JmsItemReader创建一个Spring Batch作业,这个读者将阅读,直到没有更多内容可读,然后它将全部结束。它下面还使用JmsTemplate

当你使用Spring Boot时,你可以做的是使用cron作业来每天触发这个工作(这基本上是启动你创建的jar)。另请参阅Spring Boot的参考指南,了解如何使用batch applications