1. 程式人生 > >從零開始···AMQ主題模式實現

從零開始···AMQ主題模式實現

上一章實現了點對點的訊息模式,接下來試著實現一下主題模式。
兩者程式碼大致相同,但卻讓我糾結了好久才成功。
首先要理解一下主題模式的概念:
同樣是釋出者和消費者,這裡釋出者將訊息釋出到一個主題下,這時,訂閱了這個主題的消費者就能接收到釋出的訊息。
簡單來說,就像是訂閱雜誌,從你訂閱雜誌開始,你就能收到接下來出的雜誌,但你肯定收不到之前已經發布的雜誌。
這是與佇列不同的地方,佇列類似把訊息放到一個地方,等著消費者過來取,取走了就沒了,只有一份;主題是把訊息複製傳送給所有訂閱了的消費者,只發送一次,所以後訂閱的收不到這個訊息。
以上是我的理解,有錯誤的地方請指正,謝謝。
接下來就是程式碼:
釋出者的程式碼基本相同,唯一改變的地方是建立地址:
程式碼


這裡用的是createTopic方法,因為使用的是主題模式。
然後需要一個監聽器,相當於幫助消費者訂閱主題的:

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class MyMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message) {
        try
{ System.out.println("topic message" + ((TextMessage) message).getText()); } catch (JMSException e) { e.printStackTrace(); } } }

然後就是消費者的程式碼,同樣修改不是很大:
程式碼
這裡修改了兩個地方,一個是建立地址改為建立主題。另一個是將接收訊息的操作交給監聽器執行。
程式碼寫好以後,先執行消費者類,然後執行釋出者類。
在控制檯可以看到輸出:
結果
我這裡用了三個執行緒進行測試,可以看到三個消費者都分別拿到了訊息資料。