隊列(Queue)和主題(Topic)是JMS支持的兩種消息傳遞模型:
1、點對點(point-to-point,簡稱PTP)Queue消息傳遞模型:
通過該消息傳遞模型,一個應用程序(即消息生產(chǎn)者)可以向另外一個應用程序(即消息消費者)發(fā)送消息。在此傳遞模型中,消息目的地類型是隊列(即Destination接口實現(xiàn)類實例由Session接口實現(xiàn)類實例通過調(diào)用其createQueue方法并傳入隊列名稱而創(chuàng)建)。消息首先被傳送至消息服務器端特定的隊列中,然后從此對列中將消息傳送至對此隊列進行監(jiān)聽的某個消費者。同一個隊列可以關聯(lián)多個消息生產(chǎn)者和消息消費者,但一條消息僅能傳遞給一個消息消費者。如果多個消息消費者正在監(jiān)聽隊列上的消息,,JMS消息服務器將根據(jù)“先來者優(yōu)先”的原則確定由哪個消息消費者接收下一條消息。如果沒有消息消費者在監(jiān)聽隊列,消息將保留在隊列中,直至消息消費者連接到隊列為止。這種消息傳遞模型是傳統(tǒng)意義上的懶模型或輪詢模型。在此模型中,消息不是自動推動給消息消費者的,而是要由消息消費者從隊列中請求獲得。
2、發(fā)布/訂閱(publish/subscribe,簡稱pub/sub)Topic消息傳遞模型:
通過該消息傳遞模型,應用程序能夠?qū)⒁粭l消息發(fā)送給多個消息消費者。在此傳送模型中,消息目的地類型是主題(即Destination接口實現(xiàn)類實例由Session接口實現(xiàn)類實例通過調(diào)用其createTopic方法并傳入主題名稱而創(chuàng)建)。消息首先由消息生產(chǎn)者發(fā)布至消息服務器中特定的主題中,然后由消息服務器將消息傳送至所有已訂閱此主題的消費者。主題目標也支持長期訂閱。長期訂閱表示消費者已注冊了主題目標,但在消息到達目標時該消費者可以處于非活動狀態(tài)。當消費者再次處于活動狀態(tài)時,將會接收該消息。如果消費者均沒有注冊某個主題目標,該主題只保留注冊了長期訂閱的非活動消費者的消息。與PTP消息傳遞模型不同,pub/sub消息傳遞模型允許多個主題訂閱者接收同一條消息。JMS一直保留消息,直至所有主題訂閱者都接收到消息為止。pub/sub消息傳遞模型基本上是一個推模型。在該模型中,消息會自動廣播,消息消費者無須通過主動請求或輪詢主題的方法來獲得新的消息。
具體區(qū)別對比如下:
類型 |
Topic |
Queue |
概要 |
Publish Subscribe messaging 發(fā)布訂閱消息 |
Point-to-Point 點對點 |
有無狀態(tài) |
topic數(shù)據(jù)默認不落地,是無狀態(tài)的。 |
Queue數(shù)據(jù)默認會在mq服務器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存儲。 |
完整性保障 |
并不保證publisher發(fā)布的每條數(shù)據(jù),Subscriber都能接受到。 |
Queue保證每條數(shù)據(jù)都能被receiver接收。 |
消息是否會丟失 |
一般來說publisher發(fā)布消息到某一個topic時,只有正在監(jiān)聽該topic地址的sub能夠接收到消息;如果沒有sub在監(jiān)聽,該topic就丟失了。 |
Sender發(fā)送消息到目標Queue,receiver可以異步接收這個Queue上的消息。Queue上的消息如果暫時沒有receiver來取,也不會丟失。 |
消息發(fā)布接收策略 |
一對多的消息發(fā)布接收策略,監(jiān)聽同一個topic地址的多個sub都能收到publisher發(fā)送的消息。Sub接收完通知mq服務器 |
一對一的消息發(fā)布接收策略,一個sender發(fā)送的消息,只能有一個receiver接收。receiver接收完后,通知mq服務器已接收,mq服務器對queue里的消息采取刪除或其他操作。 |