我开发了一个 @JMSListener,它从 Java 属性获取目的地并且工作得很好。
但现在我需要能够在运行时更改队列的“目的地”,而不必重置整个应用程序,即使我在运行时修改属性,队列“目的地”也不会更改。
以下是我们如何实现@JMSListener:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@Component("b2b.CCRReceiver")
@Slf4j
public class CCRReceiver {
//SOME_VARIABLES
@Transactional
@JmsListener(destination = "${tibco.configuration.queues.upsert}", containerFactory = "jmsFactory", concurrency = "${jms.concurrency}")
public void receiveMessage(Message message) {
//DO_SOME_STUFF
}
}
如您所见,我第一次从值表达式获取目的地并且工作正常,但后来我不知道如何访问 JMSListener 并更改其目的地。
这可以做到吗?有什么办法可以改变目的地吗?
或者我必须以其他允许我执行此操作的方式来实现此 JMS 监听器?
最佳答案
这应该有效:
为监听器提供一个
id
属性自动连接
JmsListenerEndpointRegistry
(或以其他方式获取对其的引用)registry.getListenerContainer("myListener").stop();
registry.getListenerContainer("myListener").shutdown();
((AbstractMessageListenerContainer)registry.getListenerContainer("myListener"))
.setDestinationName("newOne")
registry.getListenerContainer("myListener").initialize();
registry.getListenerContainer("myListener").start();
关于java - 在 Spring Boot 上动态修改 @JMSListener 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60453259/