如何在我的spring启动应用程序中暂停@JmsListener?

时间:2016-01-12 03:29:49

标签: spring spring-boot spring-jms jmstemplate

这是我在春季启动时的Hornetq配置。

spring.hornetq.mode=embedded 
spring.hornetq.embedded.enabled=true
spring.hornetq.embedded.persistent=true 
spring.hornetq.port=5445 
spring.hornetq.embedded.queues=jms.testqueue

这是我的制片人

public class Producer {@Inject
private JmsTemplate jmsTemplate;
public void resolveError( String message) {  
   try{
        jmsTemplate.convertAndSend(DATA_QUEUE, message);
        }catch(Exception e){
        //log error
        }    
}}

这是我的消费者

 @JmsListener(destination = DATA_QUEUE)
public void consume(String message) throws InterruptedException {
    log.info("Receiving  event: {}", message);
    try {
       //do stuff with message
    }catch (Exception e){
        log.error(e.toString());
    }
}

这是我的配置文件

@Configuration@EnableJms public class JmsConfig {
public static final String LOGGING_SCRAPPER_KEY ="DATA_SYNC_ERROR";
public static final String DATA_QUEUE = "jms.testqueue"; }

我想减慢@JMSlistener的消耗过程,我不希望JMS监听器一直打到队列,感谢任何帮助,谢谢!!

2 个答案:

答案 0 :(得分:1)

在每个@JmsListener带注释的方法的封面下创建的侦听器都保存在注册表as explained in the documentation

如果你想暂停你的听众,很容易查找并停止它。假设你有办法调用以下bean(JMX端点,安全休息映射,等等):

static class YourService {

    private final JmsListenerEndpointRegistry registry;

    @Autowired
    public YourService(JmsListenerEndpointRegistry registry) {
        this.registry = registry;
    }

    public void stopListener() {
        this.registry.getListenerContainer("myListener").stop();
    }

    public void startListener() {
        this.registry.getListenerContainer("myListener").start();
    }

}

然后,您需要在上面的示例中将正确的id与您的侦听器(myListener)相关联。

@JmsListener(id = "myListener", destination = DATA_QUEUE)
public void consume(String message) throws InterruptedException { ... }

答案 1 :(得分:0)

我无法设置JmsListener的消耗时间,但我找到了另一种方法,我可以在jmsTemplate上设置传递延迟时间限制,使用jmsTemplate setDeliveryDelay,这将延迟将其发送到队列。无论哪种方式,只有当你延迟JMS监听器的消费过程时才会延迟它,你将在我的方法中将消息放入队列中,直到延迟交付时间它才会在队列中。