MQ 入門(一)——MQ、JMS的瞭解與 activemq 基本操作

一、MQ
1.1 關於消息隊列 MQ
消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過寫和檢索出入列隊的針對應用程序的數據(消息)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求
1.2 MQ特點:
MQ的消費-生產者模型的一個典型的代表,一端往消息隊列中不斷的寫入消息,而另一端則可以讀取或者訂閱隊列中的消息。MQ和JMS類似,但不同的是JMS是SUN JAVA消息中間件服務的一個標準和API定義,而MQ則是遵循了AMQP協議的具體實現和產品。

1.3 使用場景:
在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。

二、JMS
參考文章:https://baike.baidu.com/item/JMS/2836691?fr=aladdin
2.1 關於JMS
JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。

2.2. JMS體系結構

JMS由以下元素組成
JMS提供者 —— 連接面向消息中間件的,JMS接口的一個實現。提供者可以是Java平臺的JMS實現,也可以是非Java平臺的面向消息中間件的適配器 (activemq,rabbitmq等)。
JMS客戶 —— 生產或消費基於消息的Java的應用程序或對象(生產者和消費者)
JMS生產者 —— 創建併發送消息的JMS客戶。(activemq 中體現爲生成消息對象,並將對象存入消息隊列中。)
JMS消費者 —— 接收消息的JMS客戶。(activemq 中體現爲獲取消息隊列中的消息對象,進行相應的業務處理)
JMS消息 —— 在JMS客戶之間傳遞的數據的對象
JMS隊列 —— 一個容納那些被髮送的等待閱讀的消息的區域。與隊列名字所暗示的意思不同,消息的接受順序並不一定要與消息的發送順序相同。
JMS主題 —— 一種支持發送消息給多個訂閱者的機制。

2.3 JMS對象類型
連接工廠(ConnectionFactory)利用連接工廠創建一個JMS連接。
JMS連接(Connection)表示JMS客戶端和服務器端之間的一個活動的連接,是由客戶端通過調用連接工廠的方法建立的。
JMS會話(Session)表示JMS客戶與JMS服務器之間的會話狀態。JMS會話建立在JMS連接上,表示客戶與服務器之間的一個會話線程。
JMS目的(Destination),又稱爲消息隊列,是實際的消息源。
生產者(Message Producer)和消費者(Message Consumer)對象由Session對象創建,用於發送和接收消息。

2.4 JMS消息通常有兩種類型:
① 點對點(Point-to-Point)。在點對點的消息系統中,消息分發給一個單獨的使用者。點對點消息往往與隊列(javax.jms.Queue)相關聯。【針對該消息,只有一個消費者將獲得消息
② 發佈/訂閱(Publish/Subscribe)。發佈/訂閱消息系統支持一個事件驅動模型,消息生產者和消費者都參與消息的傳遞。生產者發佈事件,而使用者訂閱感興趣的事件,並使用事件。該類型消息一般與特定的主題(javax.jms.Topic)關聯。【針對該消息:多個消費者可以獲得消息

3、JMS和MQ的關係:
JMS是一個用於提供消息服務的技術規範,它制定了在整個消息服務提供過程中的所有數據結構和交互流程。而MQ則是消息隊列服務,是面向消息中間件(MOM)的最終實現,是真正的服務提供者;MQ的實現可以基於JMS,也可以基於其他規範或標準。

二. ActiveMQ 瞭解與操作
對於MQ本次使用的activeMQ.
1. ActiveMQ的安裝(windows)

從官網下載安裝包, http://activemq.apache.org/download.html
直接解壓,進入相應的bin目錄下,選擇相應的版本,點擊active.bat即可
如果想把其安裝成服務,點擊InstallService.bat即可安裝成服務啓動。
圖片如下:
這裏寫圖片描述

啓動後,activeMQ會佔用兩個端口,一個是負責接收發送消息的tcp端口:61616,一個是基於web負責用戶界面化管理的端口:8161。這兩個端口可以在conf下面的xml中找到。
啓動完成後,管理界面訪問地址爲:http://localhost:8161/admin/ 默認的用戶名 :admin 密碼爲:admin 具體可以在conf文件夾下的users.properties中查看
圖片如下:
這裏寫圖片描述

2、使用java 操作activemq

2.1 生產者:產生消息對象,放入隊列中。具體代碼如下:

/**
 * 生產者
 * @author onionflower
 *
 */
public class JMSProducer {


    private static final int SENDNUM = 10;

    public static void main(String[] args) {
        //連接工廠
        ConnectionFactory connectionFactory;
        //連接
        Connection connection  = null;
        //會話,接受或者發送消息的線程
        Session session;
        //消息的目的地
        Destination destination;
        //消息生產者
        MessageProducer messageProducer;
        //實例化工廠
        connectionFactory = new ActiveMQConnectionFactory(ConnectionConstants.BROKENURL);
        try {
            //獲取連接
            connection = connectionFactory.createConnection(ConnectionConstants.USERNAME, ConnectionConstants.PASSWORD);
            //啓動連接
            connection.start();
            //創建session
            //參數1:true:當記錄被消費後,中間站中的數據不會被刪除。false:當記錄被消費後,中間站中的數據會被刪除  【參數1爲true,第二個參數無效】
            //參數2:Session.AUTO_ACKNOWLEDGE爲自動確認,客戶端發送和接收消息不需要做額外的工作。異常也會確認消息,應該是在執行之前確認的
            //Session.CLIENT_ACKNOWLEDGE爲客戶端確認。客戶端接收到消息後,必須調用javax.jms.Message的acknowledge方法。jms服務器纔會刪除消息。可以在失敗的
            //時候不確認消息,不確認的話不會移出隊列,一直存在,下次啓動繼續接受。接收消息的連接不斷開,其他的消費者也不會接受(正常情況下隊列模式不存在其他消費者)
            //DUPS_OK_ACKNOWLEDGE允許副本的確認模式。一旦接收方應用程序的方法調用從處理消息處返回,會話對象就會確認消息的接收;而且允許重複確認。在需要考慮資源使用時,這種模式非常有效。
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            //創建一個消息隊列
            destination = session.createQueue("firstDemo");
            //創建消息生成這
            messageProducer = session.createProducer(destination);
            //發送消息
            sendMessage(session, messageProducer);

            session.commit();
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException{
        for(int i=0;i<SENDNUM ;i++){
            TextMessage message = session.createTextMessage("ACTIVEMQ 生產者 生產消息,這是第"+i+"次生產");
            //發出消息
            messageProducer.send(message);
        }
    }
}

2.2 消費者:從隊列中獲取消息對象具體代碼如下:

/**
 * 消息消費者
 * @author onionflower
 *
 */
public class JMSConSumer {

    public static void main(String[] args) {
        ConnectionFactory connectionFactory ;

        Connection connection;

        Session session;

        Destination destination;
        //消息消費者
        MessageConsumer messageConsumer;

        connectionFactory = new ActiveMQConnectionFactory(ConnectionConstants.BROKENURL);

        try {
            connection = connectionFactory.createConnection(ConnectionConstants.USERNAME, ConnectionConstants.PASSWORD);

            connection.start();

            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            destination = session.createQueue("firstDemo");

            messageConsumer = session.createConsumer(destination);

            while (true) {
                TextMessage textMessage = (TextMessage) messageConsumer.receive(10000);
                if(textMessage != null){
                    System.out.println("ACTIVEMQ 消費者收到的消息:"+textMessage.getText());
                }else{
                    break;
                }
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }

    }
}

常量輔助類:

/**
 * 常量使用類
 * @author onionflower
 *
 */
public class ConnectionConstants {

    //默認用戶名
    public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    //默認密碼
    public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    //默認連接url地址
    public static final String BROKENURL = ActiveMQConnection.DEFAULT_BROKER_URL;
}

運行結果如下所示:
1、啓動生產着和消費者,啓動之後,會在管理界面可以看到消息對象的生產和消費情況,如下:
這裏寫圖片描述

控制檯運行情況如下:
這裏寫圖片描述

2、運行程序之後,我們可以返現,生成者和消費者程序啓動之後, 程序一直處於監聽狀態。

源碼下載地址如下:http://download.csdn.net/download/u012151597/10174263

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