新聞中心
ActiveMQ是一種開(kāi)源的,實(shí)現(xiàn)了JMS1.1規(guī)范的,面向消息(MOM)的中間件,為應(yīng)用程序提供高效的、可擴(kuò)展的、穩(wěn)定的和安全的企業(yè)級(jí)消息通信。ActiveMQ使用Apache提供的授權(quán),任何人都可以對(duì)其實(shí)現(xiàn)代碼進(jìn)行修改。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)石峰免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
JMS
首先來(lái)說(shuō)較早以前,也就是沒(méi)有JMS的那個(gè)時(shí)候,很多應(yīng)用系統(tǒng)存在一些缺陷:
1.通信的同步性
client端發(fā)起調(diào)用后,必須等待server處理完成并返回結(jié)果后才能繼續(xù)執(zhí)行
2.client 和 server 的生命周期耦合太高
client進(jìn)程和server服務(wù)進(jìn)程都必須可用,如果server出現(xiàn)問(wèn)題或者網(wǎng)絡(luò)故障,那么client端會(huì)收到異常
3.點(diǎn)對(duì)點(diǎn)通信
client端的一次調(diào)用只能發(fā)送給某一個(gè)單獨(dú)的服務(wù)對(duì)象,無(wú)法一對(duì)多
JMS,即Java Message Service,通過(guò)面向消息中間件(MOM:Message Oriented Middleware)的方式很好的解決了上面的問(wèn)題。大致的過(guò)程是這樣的:發(fā)送者把消息發(fā)送給消息服務(wù)器,消息服務(wù)器將消息存放在若干隊(duì)列/主題中,在合適的時(shí)候,消息服務(wù)器會(huì)將消息轉(zhuǎn)發(fā)給接受者。在這個(gè)過(guò)程中,發(fā)送和接受是異步的,也就是發(fā)送無(wú)需等待,而且發(fā)送者和接受者的生命周期也沒(méi)有必然關(guān)系;在pub/sub模式下,也可以完成一對(duì)多的通信,即讓一個(gè)消息有多個(gè)接受者。
JMS
需要注意的是,JMS只是定義了Java訪問(wèn)消息中間件的接口,其實(shí)就是在包javax.jms中,你會(huì)發(fā)現(xiàn)這個(gè)包下除了異常定義,其他都是interface。我們可以掃一眼,比如Message:
Message接口
我想你應(yīng)該發(fā)現(xiàn)了,JMS只給出接口,然后由具體的中間件去實(shí)現(xiàn),比如ActiveMQ就是實(shí)現(xiàn)了JMS的一種Provider,還有阿里巴巴的RocketMQ(后續(xù)專題中在為大家介紹)。這些消息中間件都符合JMS規(guī)范。說(shuō)起規(guī)范,自然要定義一些術(shù)語(yǔ):
Provider/MessageProvider:生產(chǎn)者
Consumer/MessageConsumer:消費(fèi)者
PTP:Point To Point,點(diǎn)對(duì)點(diǎn)通信消息模型
Pub/Sub:Publish/Subscribe,發(fā)布訂閱消息模型
Queue:隊(duì)列,目標(biāo)類型之一,和PTP結(jié)合
Topic:主題,目標(biāo)類型之一,和Pub/Sub結(jié)合
ConnectionFactory:連接工廠,JMS用它創(chuàng)建連接
Connnection:JMS Client到JMS Provider的連接
Destination:消息目的地,由Session創(chuàng)建
Session:會(huì)話,由Connection創(chuàng)建,實(shí)質(zhì)上就是發(fā)送、接受消息的一個(gè)線程,因此生產(chǎn)者、消費(fèi)者都是Session創(chuàng)建的
初步來(lái)看,Session非常核心,因?yàn)楹芏鄸|西都是它創(chuàng)建的,在后文中可以通過(guò)代碼來(lái)進(jìn)一步認(rèn)識(shí)這些術(shù)語(yǔ)。
ActiveMQ QuickStartActiveMQ是Apache出品的,非常流行的消息中間件,可以說(shuō)要掌握消息中間件,需要從ActiveMQ開(kāi)始,要掌握更加強(qiáng)大的RocketMQ,也需要ActiveMQ的基礎(chǔ),因此我們來(lái)搞定它吧。官網(wǎng)地址:http://activemq.apache.org/,目前最新的版本是5.14.4,我這邊將以最新版來(lái)講解。這篇文章主要是ActiveMQ的初步,因此我這邊暫時(shí)用windows版本,后期采用Linux。
ActiveMQ目錄結(jié)構(gòu)
bin下面存放的是ActiveMQ的啟動(dòng)腳本activemq.bat,注意分32、64位
conf里面是配置文件,重點(diǎn)關(guān)注的是activemq.xml、jetty.xml、jetty-realm.properties。在登錄ActiveMQ Web控制臺(tái)需要用戶名、密碼信息;在JMS CLIENT和ActiveMQ進(jìn)行何種協(xié)議的連接、端口是什么等這些信息都在上面的配置文件中可以體現(xiàn)。
data目錄下是ActiveMQ進(jìn)行消息持久化存放的地方,默認(rèn)采用的是kahadb,當(dāng)然我們可以采用leveldb,或者采用JDBC存儲(chǔ)到MySQL,或者干脆不使用持久化機(jī)制。
webapps,注意ActiveMQ自帶Jetty提供Web管控臺(tái)
lib中ActiveMQ為我們提供了分功能的JAR包,當(dāng)然也提供了activemq-all-5.14.4.jar
在JDK安裝沒(méi)有問(wèn)題的情況下,直接activemq.bat啟動(dòng)它,并訪問(wèn)Web控制臺(tái)!
ActiveMQ Start
到這里,ActiveMQ就已經(jīng)啟動(dòng)了,So easy~
訪問(wèn)ActiveMQ web控制臺(tái)的用戶名、密碼在哪里配置的?URL當(dāng)中的端口是在哪里配置的?
username/pwd 4 access web
port 4 web console
Write Code 4 ActiveMQ
來(lái)一個(gè)HelloWorld級(jí)別的例子,來(lái)感受下ActiveMQ。具體來(lái)說(shuō),我這邊會(huì)寫(xiě)一個(gè)生產(chǎn)者用于發(fā)送消息,一個(gè)消費(fèi)者用于接收消息。實(shí)際上,JMS是有“套路”的,下面我將以生產(chǎn)者為例詳細(xì)說(shuō)明。
第一步:創(chuàng)建ConnectionFactory連接工廠
ConnectionFactory
實(shí)際上,這里是存在安全隱患的,也就是任何人一旦知道MQ的地址,就可以連接訪問(wèn)了,我們可以在activemq.xml中配置指定的用戶、密碼才能訪問(wèn)ActiveMQ。
關(guān)于broker_bind_url,默認(rèn)就是tcp://localhost:61616,說(shuō)明是采用TCP協(xié)議,61616端口。其實(shí)對(duì)于ActiveMQ不僅僅支持TCP協(xié)議,還有其他協(xié)議,開(kāi)啟了多個(gè)端口。
第二步:創(chuàng)建Connection
Connection
Connection就代表了應(yīng)用程序和消息服務(wù)器之間的通信鏈路。獲得了連接工廠后,就可以創(chuàng)建Connection。
事實(shí)上,ConnectionFactory存在重載方法:
Connection createConnection(String username,String password)
也就是說(shuō)我們也可以在這里指定用戶名、密碼進(jìn)行驗(yàn)證
第三步:創(chuàng)建Session
Session
Session,用于發(fā)送和接受消息,而且是單線程的,支持事務(wù)的。如果Session開(kāi)啟事務(wù)支持,那么Session將保存一組信息,要么commit到MQ,要么回滾這些消息。Session可以創(chuàng)建MessageProducer/MessageConsumer。
第四步:創(chuàng)建Destination
Destination
所謂消息目標(biāo),就是消息發(fā)送和接受的地點(diǎn),要么queue,要么topic。
第五步:創(chuàng)建MessageProducer
MessageProducer
第六步:設(shè)置持久化方式
持久化方式設(shè)置
第七步:定義消息對(duì)象,并發(fā)送
Message
生產(chǎn)者和消費(fèi)者之間傳遞的對(duì)象,由3個(gè)主要部分構(gòu)成:
消息頭(路由)+消息屬性(消息選擇器,以后介紹)+消息體(JMS規(guī)范的5種類型消息)
消息類型
第八步:釋放連接
release resource
必須close connection,只有這樣ActiveMQ才會(huì)釋放資源!
消費(fèi)者的代碼和上面非常類似,只不過(guò)就是創(chuàng)建MessageConsumer進(jìn)行receive而已,注意receive()/receive(long)/receiveNoWait(),這些說(shuō)明消費(fèi)者可以采用阻塞模式、非阻塞模式接受消息。
程序運(yùn)行后,我們來(lái)看一下管控臺(tái):
ActiveMQ Web Info
Messages Enqueued:表示生產(chǎn)了多少條消息,記做P
Messages Dequeued:表示消費(fèi)了多少條消息,記做C
Number Of Consumers:表示在該隊(duì)列上還有多少消費(fèi)者在等待接受消息
Number Of Pending Messages:表示還有多少條消息沒(méi)有被消費(fèi),實(shí)際上是表示消息的積壓程度,就是P-C
在說(shuō)說(shuō)Session在通過(guò)Connection創(chuàng)建Session的時(shí)候,需要設(shè)置2個(gè)參數(shù),一個(gè)是否支持事務(wù),另一個(gè)是簽收的模式。我們重點(diǎn)說(shuō)一下簽收模式:
簽收模式
什么是簽收?通俗點(diǎn)說(shuō),就是消費(fèi)者接受到消息后,需要告訴消息服務(wù)器,我收到消息了。當(dāng)消息服務(wù)器收到回執(zhí)后,本條消息將失效。因此簽收將對(duì)PTP模式產(chǎn)生很大影響。如果消費(fèi)者收到消息后,并不簽收,那么本條消息繼續(xù)有效,很可能會(huì)被其他消費(fèi)者消費(fèi)掉!
AUTO_ACKNOWLEDGE:表示在消費(fèi)者receive消息的時(shí)候自動(dòng)的簽收
CLIENT_ACKNOWLEDGE:表示消費(fèi)者receive消息后必須手動(dòng)的調(diào)用acknowledge()方法進(jìn)行簽收
DUPS_OK_ACKNOWLEDGE:簽不簽收無(wú)所謂了,只要消費(fèi)者能夠容忍重復(fù)的消息接受,當(dāng)然這樣會(huì)降低Session的開(kāi)銷
在實(shí)際中,我們應(yīng)該采用哪種簽收模式呢?CLIENT_ACKNOWLEDGE,采用手動(dòng)的方式較自動(dòng)的方式可能更好些,因?yàn)榻邮盏搅讼ⅲ⒉灰馕吨晒Φ奶幚砹讼?,假設(shè)我們采用手動(dòng)簽收的方式,只有在消息成功處理的前提下才進(jìn)行簽收,那么只要消息處理失敗,那么消息還有效,仍然會(huì)繼續(xù)消費(fèi),直至成功處理!
關(guān)于消息的priority/ttl/deliveryMode消息有優(yōu)先級(jí)及存活時(shí)間,在MessageProducer進(jìn)行send的時(shí)候,存在多個(gè)重載方法,我們來(lái)看一下:
send
在上面的code當(dāng)中,我們創(chuàng)建生產(chǎn)者的時(shí)候,指定了Destination,設(shè)置了持久化方式,實(shí)際上這些都可以不必指定的,而是到send的時(shí)候指定。而且在實(shí)際業(yè)務(wù)開(kāi)發(fā)中,往往根據(jù)各種判斷,來(lái)決定將這條消息發(fā)往哪個(gè)Queue,因此往往不會(huì)在MessageProducer創(chuàng)建的時(shí)候指定Destination。
TTL,消息的存活時(shí)間,一句話:生產(chǎn)者生產(chǎn)了消息,如果消費(fèi)者不來(lái)消費(fèi),那么這條消息保持多久的有效期
priority,消息優(yōu)先級(jí),0-9。0-4是普通消息,5-9是加急消息,消息默認(rèn)級(jí)別是4。注意,消息優(yōu)先級(jí)只是一個(gè)理論上的概念,并不能絕對(duì)保證優(yōu)先級(jí)高的消息一定被消費(fèi)者優(yōu)先消費(fèi)!也就是說(shuō)ActiveMQ并不能保證消費(fèi)的順序性!
deliveryMode,如果不指定,默認(rèn)是持久化的消息。如果可以容忍消息的丟失,那么采用非持久化的方式,將會(huì)改善性能、減少存儲(chǔ)的開(kāi)銷。
當(dāng)前標(biāo)題:深入講解一下ActiveMQ
本文地址:http://m.fisionsoft.com.cn/article/djpshjh.html


咨詢
建站咨詢
