摘要:需要對外提供配置接口,通過配置接口,動態(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 Mapmap = 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
摘要:本文主要講述消息服務(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...
摘要:介紹它是出品,最流行的,能力強(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)...
摘要:安裝到官方網(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...
摘要:本文旨在指出中集成的一些性能陷阱,在另一篇文章各組件詳解里有組件介紹及如何正確使用的內(nèi)容。因此的做法會大大降低性能,并且將大部分的時(shí)間都花在反復(fù)重建這些對象上。提供的可以讓使用避免頻繁創(chuàng)建的問題。至于使用的性能測試則留給同學(xué)自己做了。 Github 本文旨在指出Spring/Spring Boot中集成JMS的一些性能陷阱,在另一篇文章Spring JMS各組件詳解里有Spring J...
摘要:還自動配置發(fā)送和接收消息所需的基礎(chǔ)設(shè)施。支持是一個(gè)輕量級的可靠的可伸縮的可移植的消息代理,基于協(xié)議,使用通過協(xié)議進(jìn)行通信。 32. 消息傳遞 Spring框架為與消息傳遞系統(tǒng)集成提供了廣泛的支持,從使用JmsTemplate簡化的JMS API到使用完整的基礎(chǔ)設(shè)施異步接收消息,Spring AMQP為高級消息隊(duì)列協(xié)議提供了類似的特性集。Spring Boot還為RabbitTempla...
閱讀 1390·2021-11-15 18:11
閱讀 2517·2021-08-19 10:56
閱讀 686·2021-08-09 13:42
閱讀 804·2019-08-30 15:53
閱讀 2094·2019-08-30 10:55
閱讀 3153·2019-08-29 17:18
閱讀 1445·2019-08-29 13:45
閱讀 554·2019-08-29 13:15