在Spring Boot上即时修改@JMSListener目标

问题描述 投票:0回答:1

我已经开发了一个@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侦听器?

java spring spring-boot jms spring-jms
1个回答
0
投票

这应该起作用:

  • 为侦听器提供id属性

  • 自动连接JmsListenerEndpointRegistry(或获得其引用)

  • registry.getListenerContainer("myListener").stop();

  • registry.getListenerContainer("myListener").shutdown();

  • ((AbstractMessageListenerContainer) registry.getListenerContainer("myListener")).setDestinationName("newOne")

  • registry.getListenerContainer("myListener").initialize();

  • registry.getListenerContainer("myListener").start();

© www.soinside.com 2019 - 2024. All rights reserved.