成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ActiveMQ的消息模式——主題模式(Topic)

diabloneo / 1133人閱讀

摘要:主題模式又名發(fā)布訂閱者模式。先啟動兩個消費者,然后啟動生產(chǎn)者發(fā)布條消息,這時兩個消費者都可以消費服務器中的每一條消息。這就是主題模式的特點每個訂閱者都可以消費主題模式中的每一條消息。

主題模式 又名 發(fā)布訂閱者模式(Pub/Sub)。

一、主題模式特點

客戶端包括發(fā)布者和訂閱者

主題中的消息被所有訂閱者消費

消費者不能消費訂閱之前就發(fā)送到主題中的消息

二、創(chuàng)建過程

1.創(chuàng)建連接Connection
2.創(chuàng)建會話Session
3.通過Session來創(chuàng)建其它的(MessageProducer、MessageConsumer、Destination、TextMessage)
4.將生產(chǎn)者 MessageProducer 和消費者 MessageConsumer 都會指向目標 Destination
5.生產(chǎn)者向目標發(fā)送TextMessage消息send()
6.消費者設置監(jiān)聽器,監(jiān)聽消息。

三、代碼實現(xiàn)

相對于前一篇文章所講的隊列模式,主題模式只需要修改其中的createQueue()createTopic();

1. 創(chuàng)建Maven項目



    4.0.0

    com.jms
    jms-test
    1.0-SNAPSHOT
    
    
    
        
            org.apache.activemq
            activemq-all
            5.9.0
        
    

2. 生產(chǎn)者 AppProducer.java
public class AppProducer {
    private static final String url = "tcp://127.0.0.1:61616";
    private static final String topicName = "topic-test";

    public static void main(String[] args) throws JMSException {
        //1.創(chuàng)建ConnectionFactory
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //2.創(chuàng)建Connection
        Connection connection = connectionFactory.createConnection();
        //3.啟動連接
        connection.start();
        //4.創(chuàng)建會話
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.創(chuàng)建一個目標
        Destination destination = session.createTopic(topicName);
        //6.創(chuàng)建一個生產(chǎn)者
        MessageProducer producer = session.createProducer(destination);
        for (int i = 0; i < 10; i++) {
            //7.創(chuàng)建消息
            TextMessage textMessage = session.createTextMessage("test" + i);
            //8.發(fā)布消息
            producer.send(textMessage);

            System.out.println("發(fā)送消息"+textMessage.getText());
        }

        //9.關閉連接
        connection.close();

    }
}
3. 消費者 AppConsumer.java
public class AppConsumer {
    private static final String url = "tcp://127.0.0.1:61616";
    private static final String topicName = "topic-test";

    public static void main(String[] args) throws JMSException {
        //1. 創(chuàng)建ConnectionFactory
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //2. 創(chuàng)建Connection
        Connection connection = connectionFactory.createConnection();
        //3. 啟動連接
        connection.start();
        //4. 創(chuàng)建會話
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5. 創(chuàng)建一個目標
        Destination destination = session.createTopic(topicName);
        //6. 創(chuàng)建一個消費者
        MessageConsumer consumer = session.createConsumer(destination);
        //7. 創(chuàng)建一個監(jiān)聽器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                try {
                    System.out.println("接收消息  = [" + ((TextMessage) message).getText() + "]");
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        //8.關閉連接
        //connection.close();
    }
}
四、運行查看 1. 先運行生產(chǎn)者 AppProducer

會發(fā)現(xiàn)有10條消息被發(fā)布

2. 消息發(fā)布后再開啟一個消費者 AppConsumer

運行AppConsumer.java后會發(fā)現(xiàn)發(fā)布的10條消息并沒有被消費者接收,因為在主題模式中: 只有提前進行訂閱的消費者才能成功消費消息。而隊列模式中消費者不需要提前訂閱也可以消費消息。如下圖:

3.先開啟兩個消費者,后運行生產(chǎn)者

會發(fā)現(xiàn)生產(chǎn)者發(fā)送的10個消息,兩個消費者都全部接收。

AppConsumer1

接收消息  = [test0]
接收消息  = [test1]
接收消息  = [test2]
接收消息  = [test3]
接收消息  = [test4]
接收消息  = [test5]
接收消息  = [test6]
接收消息  = [test7]
接收消息  = [test8]
接收消息  = [test9]

AppConsumer2

接收消息  = [test0]
接收消息  = [test1]
接收消息  = [test2]
接收消息  = [test3]
接收消息  = [test4]
接收消息  = [test5]
接收消息  = [test6]
接收消息  = [test7]
接收消息  = [test8]
接收消息  = [test9]
4. 小結

先啟動生產(chǎn)者,發(fā)布10條消息,然后再啟動消費者,這時消費者是不能消費到消息的,因為主題模式中: 只有提前進行訂閱的消費者才能成功消費消息。而隊列模式消費者不需要提前訂閱也可以消費消息

先啟動一個消費者,然后再啟動生產(chǎn)者發(fā)布10條消息,這時消費者成功消費了ActiveMQ服務器中的消息。

先啟動兩個消費者,然后啟動生產(chǎn)者發(fā)布10條消息,這時兩個消費者都可以消費ActiveMQ服務器中的每一條消息。這就是主題模式的特點: 每個訂閱者都可以消費主題模式中的每一條消息。而隊列模式中,只能平均消費消息,被別的消費者消費的消息不能重復被其他的消費者消費

五、隊列模式和主題模式的區(qū)別

是否需要提前訂閱
隊列模式:消費者不需要提前訂閱也可以消費消息
主題模式:只有提前進行訂閱的消費者才能成功消費消息

多個消費者如何分配消息
隊列模式:只能平均消費消息,被別的消費者消費的消息不能重復被其他的消費者消費
主題模式:每個訂閱者都可以消費主題模式中的每一條消息

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/69197.html

相關文章

  • 慕課網(wǎng)_《Java消息中間件》學習總結

    摘要:時間年月日星期六說明本文部分內容均來自慕課網(wǎng)。這個時候,可以啟動多臺積分系統(tǒng),來同時消費這個消息中間件里面的登錄消息,達到橫向擴展的作用。 時間:2017年07月22日星期六說明:本文部分內容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程安排 Java...

    twohappy 評論0 收藏0
  • 消息隊列ActiveMQ使用詳解

    摘要:學習消息隊列的使用之前,我們先來搞清。是操作消息的接口。消息生產(chǎn)者由創(chuàng)建,并用于將消息發(fā)送到。接收消息打印結果這是接收到的消息消費者啟動。。。。 通過上一篇文章 《消息隊列深入解析》,我們已經(jīng)消息隊列是什么、使用消息隊列的好處以及常見消息隊列的簡單介紹。 這一篇文章,主要帶大家詳細了解一下消息隊列ActiveMQ的使用。 學習消息隊列ActiveMQ的使用之前,我們先來搞清JMS。 J...

    niceforbear 評論0 收藏0
  • 消息中間件及ActiveMQ介紹

    摘要:中間件的分類基于遠程過程調用的中間件?;趯ο笳埱蟠淼闹虚g件。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進行通信,而不是通過直接調用彼此來通信,直接調用通常是用于諸如遠程過程調用的技術。 一.中間件 1.1 什么是中間件? 由于業(yè)務、機構和技術是不斷變化的,因此為其服務的軟件系統(tǒng)必須適應這樣的變化。在合并、添加服務或擴展可用服務之后,公司可能無力負擔重新創(chuàng)建信息系統(tǒng)所需的成本。正是在...

    jaysun 評論0 收藏0
  • JMS 在 SpringBoot 中使用

    摘要:本文主要講述消息服務在中的使用。所以需要一個監(jiān)聽容器工廠的概念,即接口,它會引用上面創(chuàng)建好的與的連接工廠,由它來負責接收消息以及將消息分發(fā)給指定的監(jiān)聽器。為了消費消息,訂閱者必須保持運行的狀態(tài)。 JMS 在 SpringBoot 中的使用 摘要:本文屬于原創(chuàng),歡迎轉載,轉載請保留出處:https://github.com/jasonGeng88/blog> 本文所有服務均采用doc...

    Michael_Ding 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<