成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringBoot @JmsListener(destination = ) 運(yùn)行時(shí)動態(tài)修改

Terry_Tai / 1026人閱讀

摘要:需要對外提供配置接口,通過配置接口,動態(tài)配置,可接收的消息。遇到問題正式這種注解的方式,使得只能在代碼中寫死,沒法動態(tài)修改。而我想實(shí)現(xiàn)的效果是能夠動態(tài)的修改,動態(tài)的創(chuàng)建。因此能不能動態(tài)修改配置文件對應(yīng)的變量,然后消費(fèi)者動態(tài)注入。

背景

最近在寫一個(gè)Mqtt消息轉(zhuǎn)發(fā)的中間件,可通過ActvieMq接收消息。需要對外提供配置接口,通過配置接口,動態(tài)配置Queue,可接收Queue的消息。

整個(gè)項(xiàng)目依賴于SpringBoot ,通過SpringBoot實(shí)現(xiàn)隊(duì)列消費(fèi),只需要通過@JmsListener(destination = "queueName") 注解,就可以實(shí)現(xiàn)對特定隊(duì)列的消費(fèi)。

遇到問題

正式這種注解的方式,使得destination只能在代碼中寫死,沒法動態(tài)修改。 而我想實(shí)現(xiàn)的效果是能夠動態(tài)的修改destination,動態(tài)的創(chuàng)建Consumer。

解決方案

繼續(xù)使用@JmsListener,找到某種方式,能夠動態(tài)修改destination

不使用@JmsListener,通過ActiveMq提供的Jar,手動實(shí)現(xiàn)連接、消費(fèi)等。之前通過這種方式實(shí)現(xiàn)過RabbitMq的處理,因此該方案不會有難度,只是工作量多一些。

由于SpringBoot的過分簡單,因此開始嘗試通過第一種方式。

解決過程

一開始想著通過反射修改注解destination但是嘗試失敗。后來想到@JmsListener(destination = "${xxx}")這種方式,根據(jù)配置文件,可以修改消費(fèi)的隊(duì)列,但是需要從新啟動。 因此能不能動態(tài)修改配置文件對應(yīng)的變量,然后消費(fèi)者動態(tài)注入Spring。

自定義實(shí)現(xiàn)一個(gè)MapPropertySource,然后加入到Environment中

@Configuration
public class DynamicTestSetting {

public static final String DYNAMIC_CONFIG = "dynamic_settting";
@Autowired
AbstractEnvironment environment;

@PostConstruct
public void init() {
    environment.getPropertySources().addFirst(new DynamicLoadPropertySource(DYNAMIC_CONFIG, null));
}

}

@Slf4j
public class DynamicLoadPropertySource extends MapPropertySource {

private static Map map = new ConcurrentHashMap(64);

private static ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1);
static {
    scheduled.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            //測試:定時(shí)修改value
            //真正使用可能需要傳遞一個(gè)參數(shù)或者定時(shí)讀取配置文件
            map.put("test", String.valueOf(System.currentTimeMillis()));
        }
    }, 1, 1, TimeUnit.SECONDS);
}

public DynamicLoadPropertySource(String name, Map source) {
    super(name, map);
}


@Override
public Object getProperty(String name) {
    return map.get(name);
}

}

2.消費(fèi)者需要?jiǎng)討B(tài)加入
@Slf4j
public class TestConsumer {

@JmsListener(destination = "${test}")
public void receiveQueue(BytesMessage msg) {
    //接收消息后的處理邏輯
}

}

/*動態(tài)注入bean到spring,需要用到ApplicationContext/
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();

        BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestConsumer.class);
        defaultListableBeanFactory.registerBeanDefinition("testConsumer",definitionBuilder.getBeanDefinition());

//調(diào)用getBeaan時(shí)Spring會創(chuàng)建一個(gè)TestConsumer實(shí)例,這個(gè)時(shí)候ActiveMq中會創(chuàng)建一個(gè)destination = "${test}"隊(duì)列,TestConsummer和其綁定消費(fèi)

        TestConsumer consumer = context.getBean("testConsumer", TestConsumer.class);
        System.out.println(consumer);
        
        
動態(tài)關(guān)閉Queue的消費(fèi)者

參見另一篇:https://segmentfault.com/n/13...

參考文章:https://blog.csdn.net/qq_3491...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71482.html

相關(guān)文章

  • JMS 在 SpringBoot 中的使用

    摘要:本文主要講述消息服務(wù)在中的使用。所以需要一個(gè)監(jiān)聽容器工廠的概念,即接口,它會引用上面創(chuàng)建好的與的連接工廠,由它來負(fù)責(zé)接收消息以及將消息分發(fā)給指定的監(jiān)聽器。為了消費(fèi)消息,訂閱者必須保持運(yùn)行的狀態(tài)。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處:https://github.com/jasonGeng88/blog> 本文所有服務(wù)均采用doc...

    Michael_Ding 評論0 收藏0
  • SpringBoot ActiveMQ 整合使用

    摘要:介紹它是出品,最流行的,能力強(qiáng)勁的開源消息總線。是一個(gè)完全支持和規(guī)范的實(shí)現(xiàn),盡管規(guī)范出臺已經(jīng)是很久的事情了,但是在當(dāng)今的應(yīng)用中間仍然扮演著特殊的地位。相關(guān)文章整合使用整合使用關(guān)注我轉(zhuǎn)載請務(wù)必注明原創(chuàng)地址為安裝同之前一樣,直接在里面玩吧。 showImg(https://segmentfault.com/img/remote/1460000012996066?w=1920&h=1281)...

    gaara 評論0 收藏0
  • Spring boot 集成 ActiveMQ

    摘要:安裝到官方網(wǎng)站下載最新的的安裝包,并解壓到本地目錄下,下載鏈接如下。修改消費(fèi)者使用配置消費(fèi)者監(jiān)聽的隊(duì)列,其中是接收到的消息收到的報(bào)文為接收到的消息重新執(zhí)行 安裝ActiveMQ 到Apache官方網(wǎng)站下載最新的ActiveMQ的安裝包,并解壓到本地目錄下,下載鏈接如下:http://activemq.apache.org/do...。showImg(https://segmentfau...

    Donne 評論0 收藏0
  • 使用Spring/Spring Boot集成JMS的陷阱

    摘要:本文旨在指出中集成的一些性能陷阱,在另一篇文章各組件詳解里有組件介紹及如何正確使用的內(nèi)容。因此的做法會大大降低性能,并且將大部分的時(shí)間都花在反復(fù)重建這些對象上。提供的可以讓使用避免頻繁創(chuàng)建的問題。至于使用的性能測試則留給同學(xué)自己做了。 Github 本文旨在指出Spring/Spring Boot中集成JMS的一些性能陷阱,在另一篇文章Spring JMS各組件詳解里有Spring J...

    xcold 評論0 收藏0
  • Spring Boot 參考指南(消息傳遞)

    摘要:還自動配置發(fā)送和接收消息所需的基礎(chǔ)設(shè)施。支持是一個(gè)輕量級的可靠的可伸縮的可移植的消息代理,基于協(xié)議,使用通過協(xié)議進(jìn)行通信。 32. 消息傳遞 Spring框架為與消息傳遞系統(tǒng)集成提供了廣泛的支持,從使用JmsTemplate簡化的JMS API到使用完整的基礎(chǔ)設(shè)施異步接收消息,Spring AMQP為高級消息隊(duì)列協(xié)議提供了類似的特性集。Spring Boot還為RabbitTempla...

    Doyle 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<