SpringBoot整合ActiveMQ入門實(shí)踐
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
66套java從入門到精通實(shí)戰(zhàn)課程分享
目標(biāo)
編寫并運(yùn)行一個Demo直觀看出ActiveMQ的效果
步驟
下載ActiveMQ
下載地址:http://activemq.apache.org/components/classic/download/
Linux下載后解壓,進(jìn)入bin目錄后,執(zhí)行“./activemq start”即可網(wǎng)站管理端口:8161
broker端口:61616
構(gòu)建SpringBoot項(xiàng)目
必要依賴:
spring-boot-starter-web
spring-boot-starter-activemqyml配置:
broker地址:spring.activemq.broker-url
注意用tcp協(xié)議而非http協(xié)議賬號:spring.activemq.user
默認(rèn)為admin密碼:spring.activemq.password
默認(rèn)為admin
實(shí)現(xiàn)Queue和Topic的生產(chǎn)和消費(fèi)
ActiveMQ下有隊(duì)列Queue和主題Topic之分
1 Queue是生產(chǎn)者/消費(fèi)者的模式
消息不會被重復(fù)消費(fèi),當(dāng)發(fā)出消息時沒有消費(fèi)者時,消息也會保存在broker中,等到出現(xiàn)消費(fèi)者時供其消費(fèi)。
2 Topic是發(fā)布/訂閱的模式
消息一旦發(fā)出會被當(dāng)時存在的所有訂閱者消費(fèi),當(dāng)發(fā)出消息時沒有消費(fèi)者,消息不會保存。生產(chǎn)者
1 對于Destination,Queue和Topic使用的類是有區(qū)別的。
2 框架會根據(jù)yml中的服務(wù)器信息自動注入生成jmsMessagingTemplate。
@Service
public?class?Producer?{
????@Autowired
????private?JmsMessagingTemplate?jmsMessagingTemplate;
????//Queue消息不能被重復(fù)消費(fèi)?即使沒有消費(fèi)者?消息也會被保存
????public?void?sendQueueMessage(String?queueName,?String?message){
????????System.out.println("==========>>>>>?Queue發(fā)送消息:?"?+?message);
????????Destination?destination?=?new?ActiveMQQueue(queueName);
????????jmsMessagingTemplate.convertAndSend(destination,?message);
????}
????//Topic消息會被所有訂閱者消費(fèi)?沒有訂閱者時?消息不會保存
????public?void?sengTopicMessage(String?topicName,?String?message){
????????System.out.println("==========>>>>>?Topic發(fā)送消息:?"?+?message);
????????Destination?destination?=?new?ActiveMQTopic(topicName);
????????jmsMessagingTemplate.convertAndSend(destination,?message);
????}
}
消費(fèi)者
1 為了讓效果明顯一些,我各創(chuàng)建了2個Queue消費(fèi)者和2個Topic消費(fèi)者。
2 消費(fèi)者方法名上要加注解@JmsListener,并配置好destination即可實(shí)現(xiàn)消費(fèi)者的功能。
3 ActiveMQ默認(rèn)pub-sub-domain=false,即不支持Topic,只支持Queue。
4 為了兼容支持Topic,需要對JmsListenerContainerFactory進(jìn)行自定義配置。
5 Topic消費(fèi)方法的@JmsListener中的參數(shù)containerFactor即為需要自定義配置的項(xiàng),其值jmsTopicListenerContainer是自定義的方法名字,這個名字隨便起,具體配置在下方。
@Service
public?class?Customer?{
????@JmsListener(destination?=?"test.queue")
????public?void?receiveQueueMessage1(String?message){
????????System.out.println("<<<<<==========?Mary消費(fèi):?"?+?message);
????}
????@JmsListener(destination?=?"test.queue")
????public?void?receiveQueueMessage2(String?message){
????????System.out.println("<<<<<==========?Jmy消費(fèi):?"?+?message);
????}
????//要配置containerFactory?值為@Bean的方法名
????//否則會走默認(rèn)的配置?默認(rèn)的只支持Queue?不支持Topic
????@JmsListener(destination?=?"test.topic",?containerFactory?=?"jmsTopicListenerContainer")
????public?void?receiveTopicMessage1(String?message){
????????System.out.println("<<<<<==========?Peggy消費(fèi):?"?+?message);
????}
????@JmsListener(destination?=?"test.topic",?containerFactory?=?"jmsTopicListenerContainer")
????public?void?receiveTopicMessage2(String?message){
????????System.out.println("<<<<<==========?Hermione消費(fèi):?"?+?message);
????}
}
ActiveMQ對于支持Topic的配置
1 主要是為了讓pub-sub-domain為true。
2 方法參數(shù)ActiveMQConnectionFactory也是框架自動幫忙注入的,而且不用通過@Autowired這樣的方式,就寫成下邊代碼所示的那樣就行。
3 如果僅僅是下邊的代碼,啟動時還是會報錯,要額外在yml中配置spring.jms.cache.enabled=false。
@Configuration
public?class?ActiveMQConfig?{
????//主要是配置PubSubDomain為true
????//參數(shù)connectionFactory的值是根據(jù)yml中的配置自動注入的
????//一定要在yml中配置spring.jms.cache.enabled?=?false
????@Bean
????public?JmsListenerContainerFactory>?jmsTopicListenerContainer(ActiveMQConnectionFactory?connectionFactory){
????????DefaultJmsListenerContainerFactory?factory?=?new?DefaultJmsListenerContainerFactory();
????????factory.setPubSubDomain(true);
????????factory.setConnectionFactory(connectionFactory);
????????return?factory;
????}
}
效果
測試代碼
@SpringBootTest
@RunWith(SpringRunner.class)
public?class?ActiveMQTest?{
????@Autowired
????private?Producer?producer;
????@Test
????public?void?TestProcess(){
????????for(int?i?=?1;?i?<=?10;?i++){
????????????producer.sendQueueMessage("test.queue",?"Queue?Message:?Q"?+?i);
????????????producer.sengTopicMessage("test.topic",?"Topic?Message:?T"?+?i);
????????}
????}
}
效果
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q1
<<<<<==========?Jmy消費(fèi):?Queue?Message:?Q1
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T1
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T1
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T1
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q2
<<<<<==========?Mary消費(fèi):?Queue?Message:?Q2
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T2
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T2
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T2
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q3
<<<<<==========?Jmy消費(fèi):?Queue?Message:?Q3
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T3
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T3
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T3
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q4
<<<<<==========?Mary消費(fèi):?Queue?Message:?Q4
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T4
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T4
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T4
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q5
<<<<<==========?Jmy消費(fèi):?Queue?Message:?Q5
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T5
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T5
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T5
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q6
<<<<<==========?Mary消費(fèi):?Queue?Message:?Q6
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T6
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T6
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T6
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q7
<<<<<==========?Jmy消費(fèi):?Queue?Message:?Q7
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T7
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T7
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T7
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q8
<<<<<==========?Mary消費(fèi):?Queue?Message:?Q8
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T8
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T8
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T8
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q9
<<<<<==========?Jmy消費(fèi):?Queue?Message:?Q9
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T9
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T9
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T9
==========>>>>>?Queue發(fā)送消息:?Queue?Message:?Q10
<<<<<==========?Mary消費(fèi):?Queue?Message:?Q10
==========>>>>>?Topic發(fā)送消息:?Topic?Message:?T10
<<<<<==========?Hermione消費(fèi):?Topic?Message:?T10
<<<<<==========?Peggy消費(fèi):?Topic?Message:?T10
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
http://blog.csdn.net/m0_37676106/article/details/108683244
粉絲福利:108本java從入門到大神精選電子書領(lǐng)取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進(jìn)入java1234官方微信群
感謝點(diǎn)贊支持下哈?
