MQ,中文名字叫做消息中間件。既然是中間件,那么就說明它左邊有東西,右邊也有東西。那么左邊是什么?右邊又是什么呢?MQ在中間能干嘛呢?看看下面的例子。 1、生活中的case: 2、優(yōu)化方案: 這個(gè)案例中的班長就是一個(gè)中間件,它不處理真正的邏輯,只是一個(gè)中間人。學(xué)生不直接問老師,而是通過班長,使得學(xué)生和老師解耦了;其次,學(xué)生上午交的問題,可能下午才得到老師的解答,整個(gè)過程是異步的;即便有一大群學(xué)生來問問題,這些請(qǐng)求也會(huì)堆積在班長那里,可以幫老師抵流量沖擊,而不會(huì)影響到老師。綜上:
進(jìn)入到bin目錄,然后執(zhí)行如下命令:
activeMQ的后臺(tái)啟動(dòng)端口是 61616,要想查看是否啟動(dòng)成功,有如下幾種方式:
activemq還有一個(gè)圖形界面,端口是 8161。首先保證你的 Linux 虛擬機(jī)和 windows 的 ip 處于同一個(gè)網(wǎng)段,然后確保沒有被防火墻給屏蔽,在Linux 和 windows 上互 ping 一下。能 ping 通后,就在 瀏覽器訪問 192.168.x.xx:8161, 默認(rèn)的用戶名和密碼都是 admin。訪問后可以看到如下界面: ![]() 上面舉了生活中的例子來說明MQ的作用,說白了就是我們先把問題發(fā)到MQ中,然后從MQ中取出消息。那么具體是發(fā)送到MQ中的什么位置呢?這個(gè)位置我們管它叫destination,即目的地。
運(yùn)行后,就可以在8161端口看到如下信息了: ![]()
運(yùn)行后,在8161端口就可以看到如下變化: ![]() 可以看到消息隊(duì)列為3,出列的也是3,說明消費(fèi)完了。
從上面生產(chǎn)消息和消費(fèi)消息的demo中可以發(fā)現(xiàn),其步驟其實(shí)和JDBC操作數(shù)據(jù)庫差不多,都是先創(chuàng)建factory,然后通過factory創(chuàng)建connection連接,再創(chuàng)建session,最后執(zhí)行操作的是session。點(diǎn)對(duì)點(diǎn)傳輸還有如下特點(diǎn):
關(guān)于發(fā)布與訂閱,相比點(diǎn)對(duì)點(diǎn),只需要把queue改成topic就可以了,這里就不再貼代碼了。 關(guān)于topic和queue的區(qū)別,如下表所示: 1、什么是JMS?
在消費(fèi)者中取出消息后:
即可取出消息屬性。 3、如何保證消息的可靠性?(面試重點(diǎn)) 一般要從三個(gè)角度去回答(持久性、事務(wù)、簽收)。- 持久性:持久,是MQ掛了,消息依然存在,非持久,就是MQ掛了,消息就沒了。隊(duì)列生產(chǎn)者的持久性:
隊(duì)列設(shè)置為非持久,如果生產(chǎn)者將消息發(fā)送到MQ后,MQ掛了,那么這些消息就沒了,即使MQ恢復(fù)正常也沒了。隊(duì)列設(shè)置為持久,那么消息只要還沒消費(fèi)就還會(huì)有。activeMQ的隊(duì)列默認(rèn)設(shè)置了持久,可保證消息只被傳送一次和成功使用一次。 主題的持久性:
主題設(shè)置了持久的話,一定要先運(yùn)行一次消費(fèi)者,等于向MQ注冊(cè),表示我訂閱了這個(gè)主題。然后再運(yùn)行生產(chǎn)者發(fā)送信息,此時(shí),不論消費(fèi)者是否還在線,都會(huì)接收到消息,不在線的話,下次連接的時(shí)候,會(huì)把沒有收過的消息都接收下來。 - 事務(wù):創(chuàng)建session的時(shí)候要傳兩個(gè)參數(shù),一個(gè)是事務(wù),一個(gè)是簽收。生產(chǎn)者事務(wù):
第一個(gè)參數(shù)就是表示事務(wù),設(shè)置為false,表示只要執(zhí)行了send方法,消息就進(jìn)入到隊(duì)列中了;如果設(shè)置為true,需要send后再執(zhí)行commit,消息才會(huì)被提交到隊(duì)列中。所以在session提交前,需要調(diào)commit方法,如下:
生產(chǎn)者主事務(wù),不管簽收,因?yàn)橄M(fèi)者才需要簽收嘛。生產(chǎn)者設(shè)置了事務(wù),簽收機(jī)制就無所謂了,只是這個(gè)方法需要傳一個(gè)簽收機(jī)制,其實(shí)事務(wù)設(shè)置為true后,起作用的就是事務(wù)了。 消費(fèi)者事務(wù): 如果消費(fèi)者開啟了事務(wù),進(jìn)行消費(fèi)時(shí)而沒有commit的話,MQ會(huì)認(rèn)為你還沒有成功消費(fèi)消息,就會(huì)出現(xiàn)重復(fù)消費(fèi)的情況,所以消費(fèi)者一般不開啟事務(wù),而是以簽收機(jī)制為主。簽收:簽收機(jī)制有四種,用得較多的是自動(dòng)和手動(dòng)兩種方式。消費(fèi)者非事務(wù)的手動(dòng)簽收:
如果這個(gè)時(shí)候直接運(yùn)行消費(fèi)者,發(fā)現(xiàn)又可以重復(fù)消費(fèi)消息,因?yàn)镸Q不知道你已經(jīng)簽收消息了。所以在receive到消息后,應(yīng)該手動(dòng)簽收,才不會(huì)重復(fù)消費(fèi),如下:
消費(fèi)者開啟事務(wù)的情況下的簽收:
開啟了事務(wù),就會(huì)自動(dòng)設(shè)置為自動(dòng)簽收,即使后面那個(gè)參數(shù)設(shè)置了手動(dòng)簽收,也不起作用了。所以,不需要調(diào)用acknowledge()方法進(jìn)行簽收。如果開啟了事務(wù),設(shè)置了手動(dòng)簽收,調(diào)用了acknowledge()方法,但是沒有commit,還是會(huì)重復(fù)消費(fèi)。 總之,在事務(wù)會(huì)話中,當(dāng)一個(gè)事務(wù)被成功提交則消息被自動(dòng)簽收,如果事務(wù)回滾,則消息會(huì)被再次傳遞。非事務(wù)會(huì)話中,消息何時(shí)被確認(rèn)取決于創(chuàng)建會(huì)話時(shí)的簽收模式。 小結(jié):不能容忍丟失消息,就用持久訂閱,可以容忍丟失消息,就用非持久訂閱 1、什么是broker? 2、怎么用?
然后編碼:
運(yùn)行后,就可以在控制臺(tái)看到這個(gè)嵌入式的activemq已經(jīng)啟動(dòng)了。 ![]() 未完待續(xù)…![]() |
|