这是我在春季启动时的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监听器一直打到队列,感谢任何帮助,谢谢!!
答案 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监听器的消费过程时才会延迟它,你将在我的方法中将消息放入队列中,直到延迟交付时间它才会在队列中。