一、JMS概述
1、當前,COREBA、DCOM、RMI等RPC中間件技術已廣泛應用於各個領域。但是面對規模和複雜度都越來越高的分佈式系統,這些技術也顯示出其侷限性: 1)、同步通信:客戶發出調用後,必須等待服務對象完成處理並返回結果後才能繼續執行;
2)、客戶和服務對象的生命週期緊密耦合:客戶進程和服務對象進程都必須正常運行;如果由於服務對象崩潰或者網絡故障導致客戶的請求不可達,客戶會接收到異常;
3)、點對點通信:客戶的一次調用只發送給某個單獨的目標對象。
2、 面向消息的中間件(Message Oriented Middleware,MOM)較好的解決了以上問題。發送者將消息發送給消息服務器,消息服務器將消息存放在若干隊列中,在合適的時候再將消息轉發給接收者。這種模式下,發送和接收是異步的,發送者無需等待;二者的生命週期未必相同:發送消息的時候接收者不一定運行,接收消息的時候發送者也不一定運行;一對多通信:對於一個消息可以有多個接收者。
3、 JAVA消息服務(JMS)定義了Java中訪問消息中間件的接口。JMS只是接口,並沒有給予實現,實現JMS接口的消息中間件稱爲JMS Provider,已有的MOM系統包括Apache的ActiveMQ、以及阿里巴巴的RockeMQ、IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ、RabbitMQ等等,他們基本都遵循JMS規範。
4、 JMS實現JMS接口的消息中間件
Provider(MessageProvider):生產者
Consumer(MessageConsumer):消費者
PTP:Point to Point,即點對點的消息模型;
Pub/Sub:Publish/Subscribe,即發佈/訂閱的消息模型;
Queue:隊列目標;
Topic:主題目標;
ConnectionFactory:連接工廠,JMS用它創建連接;
Connection:JMS客戶端到JMS Provider的連接;
Destination:消息的目的地;
Session:會話,一個發送或者接收消息的線程;
二、ActiveMQ
ActiveMQ是Apache出品,最流行的,能力強勁的開源消息總線。
1、 ActiveMQ是一個完全支持JMS1.1和J2EE 1.4規範的JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間件仍然扮演着特殊的地位,可以說ActiveMQ在業界應用最廣泛,當然如果想要有更強大的性能和海量數據處理能力,ActiveMQ還需要不斷的升級版本,80%以上的業務我們使用ActiveMQ都足夠滿足需求,當然後續如天貓、淘寶網這種大型的電商網站,尤其是雙11這種特殊時間,ActiveMQ需要進行復雜的優化源碼以及架構設計才能完成,我們之後學習一個更強大的分佈式消息中間,RocketMQ,可以說ActiveMQ是核心,是基礎。
2、下載地址:http://activemq.apache.org/
3、ActiveMQ演示:
4、ActiveMQ的安全機制
1)、 activemq的web管理界面:http://127.0.0.1:8161/adimn
activemq管理臺使用jetty部署,所以需要修改密碼則需要到相應的配置文件;
C:\的vsoftware\apache-activemq-5.11.1\conf\jetty-realm.properties
activemq應該設置安全機制,只有符合認證的用戶才能進行發送和獲取消息,所以我們也可以在activemq.xml裏去添加安全驗證配置!
C:\devsoftware\apache-activemq-5.11.1\conf\activemq.xml,在第123行之後添加配置(添加一個插件配置即可)
2)、Connection方法使用
在成功創建正確的ConnectionFactory後,下一步將是創建一個連接,它是JMS定義的一個接口。ConnectionFactory複雜返回可以與底層消息傳遞系統進行通信的Connection實現。通常客戶端只是用單一連接。根據JMS文檔,Connection的目的是”利用JMS提供者封裝開放的連接“,以及表示“客戶端與提供者服務例程之間的開發TCP/IP套接字”。該文檔還指出Connection應該是進行客戶端身份驗證的地方等等。
當一個Connection被創建時,它的傳輸默認時關閉的,必須使用start方法開啓。一個
Connection可以建議一個或者多個Session。
當一個程序執行完成後,必須關閉之前創建的Connection,否則ActiveMQ不能釋放資源,關閉一個Connection同樣也關閉了Session,MessageProducer和MessageConsumer。
Connection createConnection();
Connection createConnection(String userName,String password,String url);
3)、Session方法使用
一旦從ConnectionFactory中獲得一個Connection,必須從Connection中創建一個或者多個Session。Session時一個發送或者接收消息的線程,可以使用Session創建MessageProducer,MessageConsumer和Message。
Session可以被事務化,也可以不被事務化,通常,可以通過向Connection上的適當創建方法傳遞一個布爾參數對此進行設置。
Session createSession(boolean transacted,int acknowledgeMode);
其中Transacted爲使用事務標識,acknowledgeMode爲簽收模式。
結束事務有兩種方法:提交或者回滾。當一個事務提交,消息被處理。如果事務中有一個步驟失敗,事務就回滾,這個事務中的已經執行的動作將被撤銷。在發送消息最後也必須要使用session.commit()方法表示提交事務。
簽收模式有三種形式:
A)、Session.AUTO_ACKNOWLEDGE當客戶端從receive或onMesssage成功返回時,Session自動簽收客戶端的這條消息的收條。
B)、Session.CLIENT_ACKNOWLEDGE客戶端通過調用消息(Message)的acknowledge方法簽收消息。在這種情況下,簽收發生在Session層面:簽收一個已消費的消息會自動地簽收這個Session所有已消費消息的收條。
C)、Session.DUPS_OK_ACKNOWLEDGE此選項指示Session不必確保對傳送消息的簽收。它可能引起消息的重複,但是降低了Session的開銷,所以只有客戶端能容忍重複的消息,纔可使用。
4)、MessageProducer
MessageProducer:MessageProducer是一個由Session創建的對象,用來向Destination發送消息。
void send(Destination destination,Message message);
void send(Destination destination,Message message,int deliveryMode,int priority,long timeToLive);
void send(Message message);
void send(Message message,int deliverMode,int priority,long timeToLiver);
其中deliveryMode爲傳送模式,priority爲消息優先級,timeToLive爲消息過期時間。
ActiveMQ支持兩種消息傳送模式:PERSISTENT和NON_PERSISTENT兩種。如果不指定傳送模式,那麼默認是持久性消息。如果容忍消息消失,那麼使用非持久性消息可以改善性能和減少存儲的開銷。
消息優先級從0-9十個級別,0-4是普通消息,5-9是加急消息。如果不指定優先級,則默認爲4.JMS不要求嚴格按照這是個優先級發送消息,但是必須保證加急消息要先於普通消息到達。
默認情況下,消息用不會過期。如果消息在特定週期內失去意義,那麼可以設置過期時間,時間單位爲毫秒。