JMS中定義了兩種消息模型:點對點(point to point, queue)和發布/訂閱(publish/subscribe,topic)。主要區別就是是否能重復消費。
點對點:Queue,不可重復消費
消息生產者生產消息發送到queue中,然后消息消費者從queue中取出並且消費消息。 消息被消費以后,queue中不再有存儲,所以消息消費者不可能消費到已經被消費的消息。
Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費、其它的則不能消費此消息了。
當消費者不存在時,消息會一直保存,直到有消費消費

發布/訂閱:Topic,可以重復消費
消息生產者(發布)將消息發布到topic中,同時有多個消息消費者(訂閱)消費該消息。
和點對點方式不同,發布到topic的消息會被所有訂閱者消費。
當生產者發布消息,不管是否有消費者。都不會保存消息

Jms規范里的兩種message傳輸方式Topic和Queue,兩者的對比如下表():
| Topic | Queue | |
| 概要 | Publish Subscribe messaging 發布訂閱消息 | Point-to-Point 點對點 |
| 有無狀態 | topic數據默認不落地,是無狀態的。 | Queue數據默認會在mq服務器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存儲。 |
| 完整性保障 | 並不保證publisher發布的每條數據,Subscriber都能接受到。 | Queue保證每條數據都能被receiver接收。 |
| 消息是否會丟失 | 一般來說publisher發布消息到某一個topic時,只有正在監聽該topic地址的sub能夠接收到消息;如果沒有sub在監聽,該topic就丟失了。 | Sender發送消息到目標Queue,receiver可以異步接收這個Queue上的消息。Queue上的消息如果暫時沒有receiver來取,也不會丟失。 |
| 消息發布接收策略 | 一對多的消息發布接收策略,監聽同一個topic地址的多個sub都能收到publisher發送的消息。Sub接收完通知mq服務器 | 一對一的消息發布接收策略,一個sender發送的消息,只能有一個receiver接收。receiver接收完后,通知mq服務器已接收,mq服務器對queue里的消息采取刪除或其他操作。 |
