我已经开发了一个@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
}
}
您可以看到,我是第一次从Value Expression获取目标位置,并且可以正常工作,但是后来我不知道如何访问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();