1. 程式人生 > >mq的基本介紹和基本用法

mq的基本介紹和基本用法

1.什麼是MQ,有什麼用?

MQ 是message queue ,訊息佇列,也叫訊息中介軟體,遵守JMS(java message service)規範的一種軟體。(同時還有另一個叫AMQP的應用層協議,語言無關性不受產品 語言等限制,rabbitMQ支援這個 )

是類似於資料庫一樣需要獨立部署在伺服器上的一種應用,提供介面給其他系統呼叫。

主要用於各個系統之間通訊的解耦。

舉例:

比如登陸系統,在登陸之後需要呼叫簡訊系統給使用者發簡訊說已經登陸,同時還需要呼叫日誌系統記錄登陸日誌,需要呼叫積分系統對登陸簽到的積分進行增加 等等等。

這種情況下,登陸系統和日誌系統,簡訊系統,積分系統等等 強耦合,其中存在可能呼叫失敗,資訊丟失等風險,同時會提高系統複雜度。

比如說登陸之後呼叫日誌系統失敗,那麼該次登陸的日誌資訊就會丟失,無法再找回。

而且順序執行,會導致登陸系統執行效率低。

那麼如果使用訊息中介軟體,登陸之後只需要將任務推入到訊息佇列中,就不用去管了。其他系統則從佇列中去獲取任務。

實現解耦和非同步呼叫 (非同步是相對於同步而言,同步是就等待,當系統執行某個任務的時候,一定要等到該任務結束,系統才會繼續往下執行,非同步則不等待。)

同時還有可以實現橫向拓展 安全可靠優點

2.常見MQ的型別

activeMQ 對java支援良好,缺點是對其他語言支援不夠友好,適合中小企業系統

rabbitMQ 對java支援良好,對其他語言也支援良好,跨平臺,語言無關

kaffka 日誌訊息中介軟體 支援大資料場景

3.JMS規範

MQ實現參照了jms規範,(規範就是一種約定)

該規範中包括

提供者:實現jms規範的中介軟體伺服器

客戶端:傳送或者接受訊息的應用程式

生產者/釋出者:建立併發送訊息的客戶端

消費者/訂閱者:接受並處理訊息的客戶端

訊息:應用程式之間傳遞的內容

訊息模式:在客戶端之間傳遞訊息的方式,jms中定義了主題和佇列兩種模式

主題模式:

假如釋出者釋出了100條訊息,那麼如果有n個訂閱者,每個訂閱者都可以獲取到100條訊息。即訂閱者可以獲取到所有的訊息(但如果訂閱是在主題釋出訊息之後,則獲取不到任何訊息,只能獲取到訂閱時間之後主題的釋出的訊息,比如說A訂閱了B, B釋出了訊息,C再訂閱了B,那麼只有a能夠獲取到訊息,C不能,因為它的訂閱行為發生在B釋出訊息之後)

佇列模式:

假如生產者傳送了100條訊息,如果有n個消費者,那麼每個訂閱者加起來獲取到的訊息總數是100。

沒有時間上限制。只要佇列中有訊息,消費者可以任意時間去取訊息,一個訊息只能被一個消費者消費。

4.jms約定的介面

ConnectionFactory 獲取與MQ服務連線的工廠類

Connection 與MQ服務的連線, 由ConnectionFactory 建立

Session 會MQ服務的會話 由Connection 建立

MessageProducer 訊息生產者,由Session 建立

MessageConsumer 訊息消費者 由Session建立

Message 訊息,由Session建立

Desination 訊息的目的地

5.原生實際程式碼例子

一.原生mq用法 佇列, 建立生產者消費者模式

生產者傳送訊息

------------------------

//1.建立connectionFactory 與mq伺服器進行連線

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 為該mq的實現 比如activeMQ rabbitMQ等

// url為伺服器地址 tcp格式 比如 tcp://xxxx:xxx

//2.建立Connection

Connection connection=connectionFactory.createConnection();

//3.啟動連線

connection,start();

//4.建立會話

Session session=connection.createSession(XXX); //xx為該session的建立時候的引數 比如設定事務,模式等等,具體依據不同的實現形式

//5.建立一個目標

Destination destination=session.createQueue(queueName);

//6.建立一個生產者

MessageProducer producer=session.createProducer(destination);

//7.建立訊息

TextMessage textMessage=session.createTextMessage("text");

//8.傳送訊息

producer.send(textMessage);

//9.關閉連線

connection.close();

----------------

消費者獲取訊息

//1.建立connectionFactory 與mq伺服器進行連線

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 為該mq的實現 比如activeMQ rabbitMQ等

// url為伺服器地址 tcp格式 比如 tcp://xxxx:xxx

//2.建立Connection

Connection connection=connectionFactory.createConnection();

//3.啟動連線

connection,start();

//4.建立會話

Session session=connection.createSession(XXX); //xx為該session的建立時候的引數 比如設定事務,模式等等,具體依據不同的實現形式

//5.建立一個目標

Destination destination=session.createQueue(queueName);

//6.建立一個消費者

MessageConsumer consumer=session.createConsumer(destination);

//7.建立一個監聽器

consumer.setMessageListener(

new MessageListener(){

public void onMessage(Message message){

TextMessage textMessage=(TextMessage)message;

//8.獲取訊息

textMessage.getText();

}});

//9.關閉連線

connection.close();

二.原生mq用法 主題, 建立釋出者 訂閱者模式

釋出者----

//1.建立connectionFactory 與mq伺服器進行連線

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 為該mq的實現 比如activeMQ rabbitMQ等

// url為伺服器地址 tcp格式 比如 tcp://xxxx:xxx

//2.建立Connection

Connection connection=connectionFactory.createConnection();

//3.啟動連線

connection,start();

//4.建立會話

Session session=connection.createSession(XXX); //xx為該session的建立時候的引數 比如設定事務,模式等等,具體依據不同的實現形式

//5.建立一個目標

Destination destination=session.createTopic(topicName);

//6.建立一個生產者

MessageProducer producer=session.createProducer(destination);

//7.建立訊息

TextMessage textMessage=session.createTextMessage("text");

//8.傳送訊息

producer.send(textMessage);

//9.關閉連線

connection.close();

---訂閱者

//1.建立connectionFactory 與mq伺服器進行連線

ConnectionFactory connectionFactory=new

XXMQConnectionFactory(url) ; //XX 為該mq的實現 比如activeMQ rabbitMQ等

// url為伺服器地址 tcp格式 比如 tcp://xxxx:xxx

//2.建立Connection

Connection connection=connectionFactory.createConnection();

//3.啟動連線

connection,start();

//4.建立會話

Session session=connection.createSession(XXX); //xx為該session的建立時候的引數 比如設定事務,模式等等,具體依據不同的實現形式

//5.建立一個目標

Destination destination=session.createTopic(topicName);

//6.建立一個消費者

MessageConsumer consumer=session.createConsumer(destination);

//7.建立一個監聽器

consumer.setMessageListener(

new MessageListener(){

public void onMessage(Message message){

TextMessage textMessage=(TextMessage)message;

//8.獲取訊息

textMessage.getText();

}});

//9.關閉連線

connection.close();

6.spring整合下的程式碼例子

ConnectionFactory用於管理連線的連線工廠 這個是

spring提供地連線池,spring提供了SingleConnectionFactory和

CachingConnectionFactory

JmsTemplate用於傳送和接受訊息的模板類,spring提供的 只要注入這個bean,既可以

用jmsTempalate方便的操作jms 不需要像之前那樣寫一堆重複程式碼

這個是執行緒安全的

MessageListerner 訊息監聽器,實現了一個onMessage方法,該方法只接收一個Message引數

傳送訊息的方法

@Autowired

JmsTemplate jmsTemplate;

@Autowired

Destination destination;

jmsTemplate.send(destination,new MessgaeCreator(){

public Message createMessage(Session session) {

TextMessage textMessage=session.createTextMessage("message");

return textMessage;

}});

JmsTemplate實際上就是做了一層封裝而已 簡化了用法 ,可以參考裡面的原始碼

相關推薦

mq基本介紹基本用法

1.什麼是MQ,有什麼用? MQ 是message queue ,訊息佇列,也叫訊息中介軟體,遵守JMS(java message service)規範的一種軟體。(同時還有另一個叫AMQP的應用層協議,語言無關性不受產品 語言等限制,rabbitMQ支援這個 ) 是類似

SQLite 數據庫介紹基本用法

png 觸發 align rim 嵌入 pan upd 參考 add ? 簡介 SQLite 是一款輕量級的關系型數據庫,同時也是一種嵌入式數據庫,與 Oracle、MySQL、SQL Server 等數據庫不同,它可以內嵌在程序中,是程序中的一個組成部分。所以,經常被應

OKHttp的介紹基本用法

      嗨,大家好。又和大家見面了,今天我和大家一起來學習一下OKHttp。      OKHttp是基於Http協議上的網路通訊,說白了就是Http協議。Http的功能OKHttp都有。那就問題來了,既然有了Http,這 強大的協議,為什麼還需要有OKHttp等將Ht

curl 介紹基本用法

curl是一個廣泛使用的用來上傳和下載的命令列工具,當然嚴格來講,它還可以有別的用途。對於測試來講,它是Web相關測試非常實用的工具,包括debugging,使用起來非常方便。而且另一方面,因為它是純命令列的工具,所以也可以非常方便的作為一個元件整合到automation或

Phoenix 介紹基本用法

Phoenix是構建在HBase上的一個SQL層,能讓我們用標準的JDBC APIs而不是HBase客戶端APIs來建立表,插入資料和對HBase資料進行查詢。Phoenix完全使用Java編寫,作為HBase內嵌的JDBC驅動。Phoenix查詢引擎會將SQL

C#多線程之旅(1)——介紹基本概念

隔離 cnblogs 影響 3-0 同時 ima 並行 logic mes 閱讀目錄 一、多線程介紹 二、Join 和Sleep 三、線程怎樣工作 四、線程和進程 五、線程的使用和誤用 原文地址:C#多線程之旅(1)——介紹和基本概念 C#多線程之旅目錄: C#

chipmunk 物理引擎的基本概念基本用法

num 碰撞回調 2.0 ddb mat sha print 單獨 得出 chipmunk是一個開源2D物理引擎, 項目主頁:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,這個引擎的資料還是不多,我閱讀了

數組運算符控制流程的基本介紹範例

布爾型 存儲 連接 clas spa short i++ switch 數組運算 總結 一、數組 1、概念 2、作用及舉例 二、運算符 1、分類 1)算術運算符 2)位運算符 3)比較運算符 4)邏輯運算符 三

java泛型的基本介紹使用

java現在開始深入學習java的泛型了,以前一直只是在集合中簡單的使用泛型,根本就不明白泛型的原理和作用。泛型在java中,是一個十分重要的特性,所以要好好的研究下。一、泛型的基本概念 泛型的定義:泛型是JDK 1.5的一項新特性,它的本質是參數化類型(Parameterized Type)的應用,也就是說

【推薦系統篇】--推薦系統介紹基本架構流程

方案 排序 技術分享 企業 生成 線上 系統 src 測試數據 一、前述 推薦系統是企業中常用的技術,所以系統的掌握推薦系統的知識是很有必要的。本專欄主要講述手機APP下載的項目。 常用的推薦方法有兩個,分別是基於物品的推薦和基於用戶的推薦。 基於用戶的推薦原理是:跟你喜好

Yii2學習筆記1--Yii2的基本介紹Composer安裝

writing req project 學習 png ive iis too 使用   Yii 是一個高性能的,以快速,安全,專業著稱 , 適用於開發 WEB2.0 應用的 PHP 框架 。自帶了豐富的功能 ,包括 MVC,DAO/ActiveRecord,I18N/L10

Docker基本介紹操作

後臺 掛載點 遷移 layer 其中 for 時間 自啟動 exe Docker基本介紹和操作 Docker基本介紹 什麽是Docker Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,它是基於 dotClo

Vue學習(2)————————目錄檔案結構介紹基本取值

此檔案是配置檔案,在命令列裡選擇的內容 在裡面也可以顯示 cnpm install 也是根據此檔案來構建依賴 各種依賴包 開發的各種資源  執行專案描述資源 打包配置檔案,讓Ide寫的vue檔案伺服器可以識別 路由配置檔案 Vue裡面的

iOS開發-多執行緒NSThread的基本介紹使用

今天給同學講解一下多執行緒的入門瞭解和使用那麼廢話不多說直接上程式碼~ NSThread建立和啟動執行緒 NSThread其他用法 其他建立執行緒方式 執行緒的狀態介紹 控制執行緒狀態 多執行緒的安全

WebService的基本介紹呼叫例項

本文由Markdown語法編輯器編輯完成。 1. WebService的基本介紹 傳統上,我們把計算機後臺程式(Daemon)提供的功能,稱為”服務”(service)。比如,讓一個防毒軟體在後臺執行,它會自動監控系統,那麼這種自動監控就是一個”服務”。通俗

IntelliJ IDEA的介紹基本設定

一、基本介紹    1、由JetBrains公司開發的一系列開發工具:IntelliJ IDEA(java、scala、Groovy開發)、Android Studio(Android開發)、Webstrom(前端開發)    PhpStrom(php開發)、RubyMine

【Android-Emulator】Android模擬器介紹基本使用

接下來講解的是ANDROID模擬器的介紹和使用,最後還有PC電腦和ANDROID模擬器訪問模擬器之間tcp/udp通訊,寫這篇文章大部分是從網路上獲取的資訊,希望對大家有幫助 1、Android模擬器介紹 Android中提供了一個模擬器來模擬ARM核的移動裝置。Andr

HTLM基本介紹使用

HTML———— 超文字標記語言, 標準通用標記語言下的一個應用。 “ 超文字 ”就是指頁面內可以包含圖片、 連結,甚至音樂、 程式等非文字元素。 超文字標記語言的結構包括 “頭”部分(英語:Head)、和“主體”部分(英語:Body),其中“頭”部提供關於網頁的資訊,“主體”部分提供網

1.rabbitmq的介紹基本使用

rabbitmq是一款訊息佇列。 首先什麼是訊息,訊息是指在應用間傳送的資料。訊息可以是簡單的字串, 也可以是一些複雜的物件。訊息佇列則是應用間進行通訊的一種方式,訊息傳送後可以立即返回,由訊息系統來確保訊息的可靠傳遞。訊息釋出者只管把訊息釋出到 MQ 中而不用管誰來取,訊息使用者只管從 MQ 中取訊息而不

JavaScript單元測試框架JsUnit基本介紹使用

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> New Document </title> <meta nam