当前位置: 首页 > 知识库问答 >
问题:

在Spring开机时动态修改@JMSListener destination

康烨伟
2023-03-14

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

共有2个答案

韩弘壮
2023-03-14

我使用组件侦听器线程来解决这个问题。使用TaskExecutor和ApplicationContext进行管理。您可以在运行时创建。我还在努力。我也会试试加里·拉塞尔的建议。关于英语,我很抱歉。请随意更正。

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) {
...
}

希望对你有所帮助

欧阳德运
2023-03-14

这应该有效:

>

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

<代码>注册表。getListenerContainer(“myListener”)。停止()

<代码>注册表。getListenerContainer(“myListener”)。关机()

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

<代码>注册表。getListenerContainer(“myListener”)。初始化()

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

 类似资料:
  • 是否可以在启动时更改值?

  • 自1.14.0开始,zuul网关支持动态修改请求参数。即在网关修改客户端传递过来的参数,然后发送到微服务端。 客户端参数{"name": "jim"} --> zuul中修改为{"name": "Lucy"} --> 微服务端将收到{"name": "Lucy"} 使用场景:客户端请求参数经过加密,在网关解密后,再次发送明文参数给微服务端 如何使用 在网关springboot启动函数中添加如下代

  • 自从本报第15期刊登了《修改开机画面上的LOGO》一文以来,在读者中引起巨大反响,不少读者来信询问CBROM软件在何处可下载,这里为大家提供一个网址:http://topage.126.com。这是作者的主页,有问题也可直接与他联系。另外,也有不少读者对这个问题提出了自己的看法,下面这两篇就比较有代表性。 修改品牌电脑Logo的经验 看了《电脑报》1999年第15期上的《修改开机画面上的LOGO》

  • 本文向大家介绍php中动态修改ini配置,包括了php中动态修改ini配置的使用技巧和注意事项,需要的朋友参考一下 1,运行时改变配置 在前一篇中曾经谈到,ini_set函数可以在php执行的过程中,动态修改php的部分配置。注意,仅仅是部分,并非所有的配置都可以动态修改。关于ini配置的可修改性,参见:http://php.net/manual/zh/configuration.changes.

  • 在我的netty应用程序中,我使用并提供IP密钥映射: 在通道已经处于活动状态并为客户端服务而不中断与这些客户端的通信后,是否可以更改映射(例如添加新ip)?

  • 我怎么在move的时候让对应的样式也修改,也就是elRed.style或elGreen.style,现在不起作用。 可以跳转到这里直接看效果: https://play.vuejs.org/#eNqlVW1r2zAQ/is3U4gDmdPto5eWbnSMwcZg7...