今天呢心血來潮,也有很多以前的學弟問到我關于消息隊列的一些問題,有個剛入門,有的有問題都來問我,那么今天來說說如何快速入門mq。
一、首先說下什么是消息隊列?
1.消息隊列是在消息的傳輸過程中保存消息的容器。
二、為什么要用到消息隊列?
主要原因是由于在高并發環境下,由于來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達 mysql ,直接導致無數的行鎖表鎖,甚至最后請求會堆積過多,從而觸發too many connections錯誤。通過使用消息隊列,我們可以異步處理請求,從而緩解系統的壓力。
三、消息隊列都分為哪幾種?
1. activemq/apollomq
優點:老牌的消息隊列,使用java語言編寫。對jms支持最好,采用多線程并發,資源消耗比較大。如果你的主語言是java,可以重點考慮。
缺點:由于歷史悠久,歷史包袱較多,版本更新很緩慢。集群模式需要依賴zookeeper實現。最新架構的產品被命名為apollo,號稱下一代activemq,目前案例較少。
2. rocketmq/kafka
優點:專為海量消息傳遞打造,主張使用拉模式,天然的集群、ha、負載均衡支持。話說還是那句話,適合不適合看你有沒有那么大的量。
缺點:所謂魚和熊掌不可兼得,放棄了一些消息中間件的靈活性,使用的場景較窄,需關注你的業務模式是否契合,否則山寨變相使用很別扭。除此之外,rocketmq沒有.net下的客戶端可用。rocketmq身出名門,但使用者不多,生態較小,畢竟消息量能達到這種體量的公司不多,你也可以直接去購買阿里云的消息服務。kafka生態完善,其代碼是用scala語言寫成,可靠性比rocketmq低一些。
3. rabbitmq
優點:生態豐富,使用者眾,有很多人在前面踩坑。amqp協議的領導實現,支持多種場景。淘寶的mysql集群內部有使用它進行通訊,openstack開源云平臺的通信組件,最先在金融行業得到運用。
缺點:erlang代碼你hold得住不? 雖然erlang是天然集群化的,但rabbitmq在高可用方面做起來還不是特別得心應手,別相信廣告。
四、我們今天重要說下如何快速上手activemq,也是在mq中最容易上手的一種
1.首先我們先下載activemq 鏈接 http://activemq.apache.org/download.html
2.
3.下載對應的版本
4.啟動activemq(我這里是mac環境,windows可雙擊運行)
出現這個說明mq已經啟動我可可以通過active默認的端口號運行https://http://localhost:8161/
這里看到他會alert一個登陸窗口 默認賬號密碼都為admin
點擊queues查看隊列是的消息,這樣我們activemq就算運行了
那么現在我將它整合在springboot里,也十分簡單 首先看下項目結構
5.加入依賴 本次用的gradle
1
|
compile( 'org.springframework.boot:spring-boot-starter-activemq:2.1.1.release' ) |
6.yml配置
1
2
3
4
5
|
spring: activemq: broker-url: tcp: //localhost:61616 user: admin password: admin |
這里注意了配置的端口號和啟動端口號不是一直的,默認為61616,在conf的jetty.xml下課進行查看也可以修改
咱們直接上代碼
7.controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package com.gd.acticemqtest.controller; import org.springframework.beans.factory.annotation.autowired; import org.springframework.jms.core.jmstemplate; import org.springframework.jms.core.messagecreator; import org.springframework.scheduling.annotation.scheduled; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import javax.jms.jmsexception; import javax.jms.message; import javax.jms.session; import javax.jms.textmessage; /** * @data 2019-01-09 22:42 * @author 張國偉 wechat:17630376104 * @description todo */ @restcontroller public class controllerdemo { @autowired private jmstemplate jmstemplate; @requestmapping ( "/sendmsg" ) public void sendmsg(string msg) { jmstemplate.send( "q2" , new messagecreator() { @override public message createmessage(session session) throws jmsexception { textmessage textmessage = session.createtextmessage(); textmessage.settext(msg); return textmessage; } }); } |
這里一定要注意的是jmstemplate到底引用的那個包
jmstemplate.send是向隊列里發送消息,并且為隊列起一個名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.gd.acticemqtest.serive; import org.springframework.jms.annotation.jmslistener; import org.springframework.stereotype.service; /** * @data 2019-01-09 22:54 * @author 張國偉 wechat:17630376104 * @description todo */ @service public class activemsglistener { @jmslistener (destination = "q2" ) public void rctivemsg(string message){ system.out.println( "------監聽到activemq的數據" +message); } } |
jmslistener是spring的針對消息的監聽器,當mq里有數據后第一時間把消息監聽到,我們跑一把試試
當敲下enter那一刻,控制臺已經把剛剛存進去的消息給打印了出來
那這個時候我們再來看下activemq的服務中是否有消息
可以看到這時候隊列里已經有了q2這個消息。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/zgwjava/p/10283908.html