JMS概述,ActiveMQ

    一、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不要求嚴格按照這是個優先級發送消息,但是必須保證加急消息要先於普通消息到達。

                            默認情況下,消息用不會過期。如果消息在特定週期內失去意義,那麼可以設置過期時間,時間單位爲毫秒。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章