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条消息。

总结:主题模式的订阅者只有再订阅之后才能接收消息,而订阅之前的消息是不能接收到的。而且订阅者接收的消息是完整接收的。不论订阅者多少,每个人接收到的消息是一样的。

你可能感兴趣的:(知识总结,Activemq)