Измените назначение @JMSListener на лету при загрузке Spring - PullRequest
0 голосов
/ 28 февраля 2020

Я разработал @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 Listener другим способом, который позволяет мне это сделать?

1 Ответ

1 голос
/ 28 февраля 2020

Это должно работать:

  • Дать слушателю свойство id

  • Автоматически подключить JmsListenerEndpointRegistry (или иным образом получить ссылка на него)

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

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

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

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

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

...