【问题标题】:Modify @JMSListener destination on-the-fly on Spring Boot在 Spring Boot 上即时修改 @JMSListener 目标
【发布时间】:2020-09-30 06:00:17
【问题描述】:

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

【问题讨论】:

    标签: java spring spring-boot jms spring-jms


    【解决方案1】:

    这应该可行:

    • 给监听器一个id属性

    • 自动连接JmsListenerEndpointRegistry(或以其他方式获取对它的引用)

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我使用组件侦听器线程解决了这个问题。使用 TaskExecutor 和 ApplicationContext 进行管理。您可以在运行时创建。我还在努力。我也会尝试 Gary Russell 的建议。 对不起英语。欢迎指正。

      applicationContext.getBean(ExampleListenerJMS.class);
      ... 
      taskExecutor.execute(exampleListenerJMS);
      

      类侦听器“实现 Runnable、MessageListener”,实现获取自定义连接管理器(activemq 服务器不同)。

      @Component
      @Scope("application")
      public class ExampleListenerJMS implements Runnable, MessageListener {
      
      private EspecificManagerJMS jms = new EspecificManagerJMS();
      
      @Override
      public void run() {
          customAndChekingActions();
      }
      
      protected void customAndChekingActions() {
      ...
          try {
              Destination destination = jms.getSession().createQueue(queue);
              MessageConsumer consumer = jms.getSession().createConsumer(destination);
              consumer.setMessageListener(this);
              ...
          } catch (JMSException e) {
              e.printStackTrace();
              ...
          }
      }
      
      @Override
      public void onMessage(Message message) {
      ...
      }
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 2016-06-07
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        相关资源
        最近更新 更多