2

这是我在 Spring Boot 中的 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 监听器一直排队等待任何帮助,谢谢!

4

2 回答 2

3

@JmsListener为每个带注释的方法创建的侦听器保存在注册表中,如文档中所述

如果你想暂停你的听众,很容易查找并停止它。假设您有一种方法可以调用以下 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 { ... }
于 2016-01-12T09:45:31.743 回答
0

我无法设置 JmsListener 的消耗时间,但我找到了一个替代方法,我可以在 jmsTemplate 上设置传递延迟时间限制,而是使用 jmsTemplate setDeliveryDelay 这将延迟将其发送到队列。无论哪种方式,只有在您延迟 JMS 侦听器的消费过程时才会延迟,在我的方法中,您将在队列中拥有消息,直到延迟交付时间才会出现在队列中。

于 2016-01-13T18:39:07.220 回答