1. 程式人生 > >ActiveMQ學習總結——(三)Topic主題模式示例

ActiveMQ學習總結——(三)Topic主題模式示例

和佇列模式相似,分別編寫生產者和訂閱者。
生產者:

package com.jms.topic;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 訊息生產者
 * @author
root * */
public class AppProducer { private static final String url="tcp://127.0.0.1:61616";//服務地址,埠預設61616 private static final String topicName="topic-test";//要建立的訊息名稱 public static void main(String[] args) throws JMSException { //1.建立ConnectiongFactory,繫結地址 ConnectionFactory factory=new
ActiveMQConnectionFactory(url); //2.建立Connection Connection connection= factory.createConnection(); //3.啟動連線 connection.start(); //4.建立會話 Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.建立一個目標 Destination destination=session.createTopic(topicName); //6.建立一個生產者
MessageProducer producer=session.createProducer(destination); for (int i = 0; i < 100; i++) { //7.建立訊息 TextMessage textMessage=session.createTextMessage("哈哈哈哈哈:"+i); //8.傳送訊息 producer.send(textMessage); System.out.println("傳送訊息:"+i); } connection.close(); } }

訂閱者:

package com.jms.topic;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
/**
 * 訂閱者
 * @author root
 *
 */
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.建立ConnectiongFactory,繫結地址
        ConnectionFactory factory=new ActiveMQConnectionFactory(url);
        //2.建立Connection
        Connection connection= factory.createConnection();
        //3.啟動連線
        connection.start();
        //4.建立會話
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.建立一個目標
        Destination destination=session.createTopic(topicName);
        //6.建立一個消費者
        MessageConsumer consumer=session.createConsumer(destination);
        //7.建立一個監聽器
        consumer.setMessageListener(new MessageListener() {

            public void onMessage(Message arg0) {
                // TODO Auto-generated method stub
                TextMessage textMessage=(TextMessage)arg0;
                try {
                    System.out.println("接收訊息:"+textMessage.getText());
                } catch (JMSException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });


    }
}

執行生產者,再服務網頁上可以看到,生產100條訊息


Name ↑  Number Of Consumers     Messages Enqueued       Messages Dequeued       Operations  

topic-test  0   100     0   Send To Active Subscribers
Active Producers
Delete

但是這時執行訂閱者並未收到訊息。因為剛才的訊息是訂閱者訂閱之前產生的,就不能接受了。類似公眾號訂閱,訂閱後的訊息可以接受,但是訂閱之前的訊息就收不到了。如果訂閱後有訊息產生,那麼就可以正常接受。

這時候再用生產者傳送100條資訊。可以看到訊息總數200


Name ↑  Number Of Consumers     Messages Enqueued       
topic-test  1   200     100

而此時訂閱者也接收到了新產生的100條訊息

接收訊息:哈哈哈哈哈:0
接收訊息:哈哈哈哈哈:1
接收訊息:哈哈哈哈哈:2
接收訊息:哈哈哈哈哈:3
接收訊息:哈哈哈哈哈:4
接收訊息:哈哈哈哈哈:5
接收訊息:哈哈哈哈哈:6
接收訊息:哈哈哈哈哈:7
接收訊息:哈哈哈哈哈:8
接收訊息:哈哈哈哈哈:9
接收訊息:哈哈哈哈哈:10
接收訊息:哈哈哈哈哈:11
接收訊息:哈哈哈哈哈:12
接收訊息:哈哈哈哈哈:13
接收訊息:哈哈哈哈哈:14
接收訊息:哈哈哈哈哈:15
接收訊息:哈哈哈哈哈:16
接收訊息:哈哈哈哈哈:17
接收訊息:哈哈哈哈哈:18
接收訊息:哈哈哈哈哈:19
接收訊息:哈哈哈哈哈:20
接收訊息:哈哈哈哈哈:21
接收訊息:哈哈哈哈哈:22
接收訊息:哈哈哈哈哈:23
接收訊息:哈哈哈哈哈:24
接收訊息:哈哈哈哈哈:25
接收訊息:哈哈哈哈哈:26
接收訊息:哈哈哈哈哈:27
接收訊息:哈哈哈哈哈:28
接收訊息:哈哈哈哈哈:29
接收訊息:哈哈哈哈哈:30
接收訊息:哈哈哈哈哈:31
接收訊息:哈哈哈哈哈:32
接收訊息:哈哈哈哈哈:33
接收訊息:哈哈哈哈哈:34
接收訊息:哈哈哈哈哈:35
接收訊息:哈哈哈哈哈:36
接收訊息:哈哈哈哈哈:37
接收訊息:哈哈哈哈哈:38
接收訊息:哈哈哈哈哈:39
接收訊息:哈哈哈哈哈:40
接收訊息:哈哈哈哈哈:41
接收訊息:哈哈哈哈哈:42
接收訊息:哈哈哈哈哈:43
接收訊息:哈哈哈哈哈:44
接收訊息:哈哈哈哈哈:45
接收訊息:哈哈哈哈哈:46
接收訊息:哈哈哈哈哈:47
接收訊息:哈哈哈哈哈:48
接收訊息:哈哈哈哈哈:49
接收訊息:哈哈哈哈哈:50
接收訊息:哈哈哈哈哈:51
接收訊息:哈哈哈哈哈:52
接收訊息:哈哈哈哈哈:53
接收訊息:哈哈哈哈哈:54
接收訊息:哈哈哈哈哈:55
接收訊息:哈哈哈哈哈:56
接收訊息:哈哈哈哈哈:57
接收訊息:哈哈哈哈哈:58
接收訊息:哈哈哈哈哈:59
接收訊息:哈哈哈哈哈:60
接收訊息:哈哈哈哈哈:61
接收訊息:哈哈哈哈哈:62
接收訊息:哈哈哈哈哈:63
接收訊息:哈哈哈哈哈:64
接收訊息:哈哈哈哈哈:65
接收訊息:哈哈哈哈哈:66
接收訊息:哈哈哈哈哈:67
接收訊息:哈哈哈哈哈:68
接收訊息:哈哈哈哈哈:69
接收訊息:哈哈哈哈哈:70
接收訊息:哈哈哈哈哈:71
接收訊息:哈哈哈哈哈:72
接收訊息:哈哈哈哈哈:73
接收訊息:哈哈哈哈哈:74
接收訊息:哈哈哈哈哈:75
接收訊息:哈哈哈哈哈:76
接收訊息:哈哈哈哈哈:77
接收訊息:哈哈哈哈哈:78
接收訊息:哈哈哈哈哈:79
接收訊息:哈哈哈哈哈:80
接收訊息:哈哈哈哈哈:81
接收訊息:哈哈哈哈哈:82
接收訊息:哈哈哈哈哈:83
接收訊息:哈哈哈哈哈:84
接收訊息:哈哈哈哈哈:85
接收訊息:哈哈哈哈哈:86
接收訊息:哈哈哈哈哈:87
接收訊息:哈哈哈哈哈:88
接收訊息:哈哈哈哈哈:89
接收訊息:哈哈哈哈哈:90
接收訊息:哈哈哈哈哈:91
接收訊息:哈哈哈哈哈:92
接收訊息:哈哈哈哈哈:93
接收訊息:哈哈哈哈哈:94
接收訊息:哈哈哈哈哈:95
接收訊息:哈哈哈哈哈:96
接收訊息:哈哈哈哈哈:97
接收訊息:哈哈哈哈哈:98
接收訊息:哈哈哈哈哈:99

這時候我們多啟動幾個訂閱者。這時候連線增加了,

Name    Remote Address      Active      Slow  
ID:localhost.localdomain-47511-1513825521558-0:1    tcp://127.0.0.1:44132   true    false
ID:localhost.localdomain-45365-1513825526379-0:1    tcp://127.0.0.1:44133   true    false
ID:localhost.localdomain-47703-1513825117371-0:1    tcp://127.0.0.1:44125   true    false
ID:localhost.localdomain-51411-1513823735949-0:1    tcp://127.0.0.1:43751   true    false
ID:localhost.localdomain-55828-1513824112837-0:1    tcp://127.0.0.1:43753   true    false
ID:localhost.localdomain-36330-1513823606217-0:1    tcp://127.0.0.1:43748   true    false

再次啟動生產者啟動訊息 100條,
這時候新增加的幾個訂閱者,和之前原有的訂閱者都收到了100條訊息。

總結:主題模式的訂閱者只有再訂閱之後才能接收訊息,而訂閱之前的訊息是不能接收到的。而且訂閱者接收的訊息是完整接收的。不論訂閱者多少,每個人接收到的訊息是一樣的。