java消息 框架_java 框架-消息队列ActiveMQ
https://www.jianshu.com/p/ecdc6eab554c
ActiveMQ從入門到精通(一)
22017.03.11 21:40:42字數 2650閱讀 57286
這是關于消息中間件ActiveMQ的一個系列專題文章,將涵蓋JMS、ActiveMQ的初步入門及API詳細使用、兩種經典的消息模式(PTP and Pub/Sub)、與Spring整合、ActiveMQ集群、監控與配置優化等。話不多說,我們來一起瞧一瞧!
JMS
首先來說較早以前,也就是沒有JMS的那個時候,很多應用系統存在一些缺陷:
1.通信的同步性
client端發起調用后,必須等待server處理完成并返回結果后才能繼續執行
2.client 和 server 的生命周期耦合太高
client進程和server服務進程都必須可用,如果server出現問題或者網絡故障,那么client端會收到異常
3.點對點通信
client端的一次調用只能發送給某一個單獨的服務對象,無法一對多
JMS,即Java Message Service,通過面向消息中間件(MOM:Message Oriented Middleware)的方式很好的解決了上面的問題。大致的過程是這樣的:發送者把消息發送給消息服務器,消息服務器將消息存放在若干隊列/主題中,在合適的時候,消息服務器會將消息轉發給接受者。在這個過程中,發送和接受是異步的,也就是發送無需等待,而且發送者和接受者的生命周期也沒有必然關系;在pub/sub模式下,也可以完成一對多的通信,即讓一個消息有多個接受者。
JMS
需要注意的是,JMS只是定義了Java訪問消息中間件的接口,其實就是在包javax.jms中,你會發現這個包下除了異常定義,其他都是interface。我們可以掃一眼,比如Message:
Message接口
我想你應該發現了,JMS只給出接口,然后由具體的中間件去實現,比如ActiveMQ就是實現了JMS的一種Provider,還有阿里巴巴的RocketMQ(后續專題中在為大家介紹)。這些消息中間件都符合JMS規范。說起規范,自然要定義一些術語:
Provider/MessageProvider:生產者
Consumer/MessageConsumer:消費者
PTP:Point To Point,點對點通信消息模型
Pub/Sub:Publish/Subscribe,發布訂閱消息模型
Queue:隊列,目標類型之一,和PTP結合
Topic:主題,目標類型之一,和Pub/Sub結合
ConnectionFactory:連接工廠,JMS用它創建連接
Connnection:JMS Client到JMS Provider的連接
Destination:消息目的地,由Session創建
Session:會話,由Connection創建,實質上就是發送、接受消息的一個線程,因此生產者、消費者都是Session創建的
初步來看,Session非常核心,因為很多東西都是它創建的,在后文中可以通過代碼來進一步認識這些術語。
ActiveMQ QuickStart
ActiveMQ是Apache出品的,非常流行的消息中間件,可以說要掌握消息中間件,需要從ActiveMQ開始,要掌握更加強大的RocketMQ,也需要ActiveMQ的基礎,因此我們來搞定它吧。官網地址:http://activemq.apache.org/,目前最新的版本是5.14.4,我這邊將以最新版來講解。這篇文章主要是ActiveMQ的初步,因此我這邊暫時用windows版本,后期采用Linux。
ActiveMQ目錄結構
bin下面存放的是ActiveMQ的啟動腳本activemq.bat,注意分32、64位
conf里面是配置文件,重點關注的是activemq.xml、jetty.xml、jetty-realm.properties。在登錄ActiveMQ Web控制臺需要用戶名、密碼信息;在JMS CLIENT和ActiveMQ進行何種協議的連接、端口是什么等這些信息都在上面的配置文件中可以體現。
data目錄下是ActiveMQ進行消息持久化存放的地方,默認采用的是kahadb,當然我們可以采用leveldb,或者采用JDBC存儲到MySQL,或者干脆不使用持久化機制。
webapps,注意ActiveMQ自帶Jetty提供Web管控臺
lib中ActiveMQ為我們提供了分功能的JAR包,當然也提供了activemq-all-5.14.4.jar
在JDK安裝沒有問題的情況下,直接activemq.bat啟動它,并訪問Web控制臺!
ActiveMQ Start
到這里,ActiveMQ就已經啟動了,So easy~
訪問ActiveMQ web控制臺的用戶名、密碼在哪里配置的?URL當中的端口是在哪里配置的?
username/pwd 4 access web
port 4 web console
Write Code 4 ActiveMQ
來一個HelloWorld級別的例子,來感受下ActiveMQ。具體來說,我這邊會寫一個生產者用于發送消息,一個消費者用于接收消息。實際上,JMS是有“套路”的,下面我將以生產者為例詳細說明。
第一步:創建ConnectionFactory連接工廠
ConnectionFactory
實際上,這里是存在安全隱患的,也就是任何人一旦知道MQ的地址,就可以連接訪問了,我們可以在activemq.xml中配置指定的用戶、密碼才能訪問ActiveMQ。
關于broker_bind_url,默認就是tcp://localhost:61616,說明是采用TCP協議,61616端口。其實對于ActiveMQ不僅僅支持TCP協議,還有其他協議,開啟了多個端口。
第二步:創建Connection
Connection
Connection就代表了應用程序和消息服務器之間的通信鏈路。獲得了連接工廠后,就可以創建Connection。
事實上,ConnectionFactory存在重載方法:
Connection createConnection(String username,String password)
也就是說我們也可以在這里指定用戶名、密碼進行驗證
第三步:創建Session
Session
Session,用于發送和接受消息,而且是單線程的,支持事務的。如果Session開啟事務支持,那么Session將保存一組信息,要么commit到MQ,要么回滾這些消息。Session可以創建MessageProducer/MessageConsumer。
第四步:創建Destination
Destination
所謂消息目標,就是消息發送和接受的地點,要么queue,要么topic。
第五步:創建MessageProducer
MessageProducer
第六步:設置持久化方式
持久化方式設置
第七步:定義消息對象,并發送
Message
生產者和消費者之間傳遞的對象,由3個主要部分構成:
消息頭(路由)+消息屬性(消息選擇器,以后介紹)+消息體(JMS規范的5種類型消息)
消息類型
第八步:釋放連接
release resource
必須close connection,只有這樣ActiveMQ才會釋放資源!
消費者的代碼和上面非常類似,只不過就是創建MessageConsumer進行receive而已,注意receive()/receive(long)/receiveNoWait(),這些說明消費者可以采用阻塞模式、非阻塞模式接受消息。
程序運行后,我們來看一下管控臺:
ActiveMQ Web Info
Number Of Consumers:表示在該隊列上還有多少消費者在等待接受消息
Number Of Pending Messages:表示還有多少條消息沒有被消費,實際上是表示消息的積壓程度,就是P-C
在說說Session
在通過Connection創建Session的時候,需要設置2個參數,一個是否支持事務,另一個是簽收的模式。我們重點說一下簽收模式:
簽收模式
什么是簽收?通俗點說,就是消費者接受到消息后,需要告訴消息服務器,我收到消息了。當消息服務器收到回執后,本條消息將失效。因此簽收將對PTP模式產生很大影響。如果消費者收到消息后,并不簽收,那么本條消息繼續有效,很可能會被其他消費者消費掉!
AUTO_ACKNOWLEDGE:表示在消費者receive消息的時候自動的簽收
CLIENT_ACKNOWLEDGE:表示消費者receive消息后必須手動的調用acknowledge()方法進行簽收
DUPS_OK_ACKNOWLEDGE:簽不簽收無所謂了,只要消費者能夠容忍重復的消息接受,當然這樣會降低Session的開銷
在實際中,我們應該采用哪種簽收模式呢?CLIENT_ACKNOWLEDGE,采用手動的方式較自動的方式可能更好些,因為接收到了消息,并不意味著成功的處理了消息,假設我們采用手動簽收的方式,只有在消息成功處理的前提下才進行簽收,那么只要消息處理失敗,那么消息還有效,仍然會繼續消費,直至成功處理!
關于消息的priority/ttl/deliveryMode
消息有優先級及存活時間,在MessageProducer進行send的時候,存在多個重載方法,我們來看一下:
send
在上面的code當中,我們創建生產者的時候,指定了Destination,設置了持久化方式,實際上這些都可以不必指定的,而是到send的時候指定。而且在實際業務開發中,往往根據各種判斷,來決定將這條消息發往哪個Queue,因此往往不會在MessageProducer創建的時候指定Destination。
TTL,消息的存活時間,一句話:生產者生產了消息,如果消費者不來消費,那么這條消息保持多久的有效期
priority,消息優先級,0-9。0-4是普通消息,5-9是加急消息,消息默認級別是4。注意,消息優先級只是一個理論上的概念,并不能絕對保證優先級高的消息一定被消費者優先消費!也就是說ActiveMQ并不能保證消費的順序性!
deliveryMode,如果不指定,默認是持久化的消息。如果可以容忍消息的丟失,那么采用非持久化的方式,將會改善性能、減少存儲的開銷。
總結
以上是生活随笔為你收集整理的java消息 框架_java 框架-消息队列ActiveMQ的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Photoshop各类抠图技巧介绍
- 下一篇: 美图秀秀一张漂亮的收藏店铺图片制作方法