ActiveMQ消息中间件简明笔记(2)——队列模式和主题模式应用开发(Java API)

安装ActiveMQ

这个就简单提一下,以windows的为例。(linux版就是里面不是bat文件而已。)

bin文件夹下存放命令,并且同时提供了32位和64位的命令包。

里面包含这样几个文件:

activemq.bat 是启动activemq中间件的启动脚本。linux中是格式不同。

启动方式和你启动tomcat一样。

InstallService.bat是将这个启动操作安装为windows的服务,你可以在windows系统的服务列表里面启动和关闭。UninstallServer.bat是卸载服务。

linux版中内容少一些,如下:

我们以win64为例,启动activemq服务:

注意:请用管理员权限启动。

从启动后控制台输出可以看到,activemq的控制台端口为8161.

我们访问http://127.0.0.1:8161/

点击Manage ActiveMQ broker

用户名输入admin,密码输入admin。

就登录进来了。可以查看active的队列、主题、订阅者、连接、网络等情况状态。

JMS开发(基本的JAVA API开发)

使用JMS接口规范连接ActiveMQ

这里我们将演示P2P和发布订阅两种模式

创建生产者

创建消费者

创建发布者

创建订阅者

建立项目

队列模式

我们先编写一个生产者客户端程序类:试着插入100个消息

package com.happybks.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class AppProducer {

    //61616是activemq默认的服务端口,通信协议是tcp。之前的8161端口是管理页面的端口
    private static final String url="tcp://127.0.0.1:61616";
    private static final String queueName="queue-happybks";
    public static void main(String[] args) throws JMSException {
        // 1、创建ConnnectionFactoty连接工厂
        //这里使用activemq的连接工厂是由ActiveMQ的服务商提供的。(以后讲spring方式继承activemq时会用到spring提供的activemq连接工厂。)
        ConnectionFactory connectionFactory=new ActiveMQConnectionFactory(url);

        //2、创建Connection连接
        Connection connection = connectionFactory.createConnection();

        //3、启动连接
        connection.start();

        //4、创建Session会话
        //第一个参数:是否支持事务,是否在事务中处理。如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
        //第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
        //这里我们先不考虑支持事务,应答方式为自动应答
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5、创建一个目标Destination
        Destination destination = session.createQueue(queueName);

        //6、创建生产者
        MessageProducer producer = session.createProducer(destination);


        for(int i=0;i<100;i++) {
            //7、创建消息
            //JMS中有很多消息体类型
            TextMessage textMessage=session.createTextMessage("msg_"+i);
            //8、发布消息
            producer.send(textMessage);
            System.out.println("已经发送消息:"+textMessage.getText());
        }

        //9、关闭连接。如果不关闭,可能会连接耗尽,就连不上activemq了。
        connection.close();
    }

}

打开activemq的管理页面,查看Connection页面,可以看到初始时没有任何连接。

打开Queue页面,可以看到初始时也没有任何消息在队列中。

然后我们运行程序AppProducer

我们再看active的管理页面:

这时候已经能看到队列里面有了100个消息。(但是此时看Connection页面还是没有连接,因为我们生产者客户端程序运行结束时将connection给close()了)

下面我们编写一个队列模式的消费者客户端程序:

package com.happybks.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppConsumer {
    private static final String url = "tcp://127.0.0.1:61616";
    private static final String queueName = "queue-happybks";

    public static void main(String[] args) throws JMSException {
        // 1、创建ConnnectionFactoty连接工厂
        //这里使用activemq的连接工厂是由ActiveMQ的服务商提供的。(以后讲spring方式继承activemq时会用到spring提供的activemq连接工厂。)
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

        //2、创建Connection连接
        Connection connection = connectionFactory.createConnection();

        //3、启动连接
        connection.start();

        //4、创建Session会话
        //第一个参数:是否支持事务,是否在事务中处理。如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
        //第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
        //这里我们先不考虑支持事务,应答方式为自动应答
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5、创建一个目标Destination
        Destination destination = session.createQueue(queueName);

        //6、创建消费者
        final MessageConsumer consumer = session.createConsumer(destination);

        //7、创建监听器
        consumer.setMessageListener(new MessageListener() {
            //覆盖实现的onMessage方法里面会回调接收消息内容
            @Override
            public void onMessage(Message message) {
                //我们之前发送的消息是TextMessage类型的消息,这里类型做个转换
                TextMessage textMessage=(TextMessage)message;
                try {
                    System.out.println("接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });


        //8、关闭连接。
        // 这里不要急着关闭连接,因为消息的接收是一个异步的过程,通过前面设置的MessageListener完成,如果我们这里立即关闭连接,就接收不到消息了。
        //在实际应用中,连接关闭最好在程序停止时关闭。
        //connection.close();
    }
}

我们启动程序AppConsumer:发现程序接收到了之前生产者发送到队列中的100个message。

并且此时程序仍不退出,因为AppConsumer的连接未关闭,仍然在监听。

我们查看activeMQ的管理页面的队列:显示有一个消费者,并且队列中的原有100个消息被消费了。

查看连接页面,有一个连接。

在P2P模式下,如果我们开两个消费者监听队列,让生产者再发送100个消息会怎么样呢?

我们先运行两个AppConsumer。然后运行刚才的AppProducer。生产者发送100个消息。

瞬间之后,两个ApppConsumer也有动作,接收到了消息输出如下:

第一个消费者:

接收消息:msg_0
接收消息:msg_2
接收消息:msg_4
接收消息:msg_6
接收消息:msg_8
接收消息:msg_10
接收消息:msg_12
接收消息:msg_14
接收消息:msg_16
接收消息:msg_18
接收消息:msg_20
接收消息:msg_22
接收消息:msg_24
接收消息:msg_26
接收消息:msg_28
接收消息:msg_30
接收消息:msg_32
接收消息:msg_34
接收消息:msg_36
接收消息:msg_38
接收消息:msg_40
接收消息:msg_42
接收消息:msg_44
接收消息:msg_46
接收消息:msg_48
接收消息:msg_50
接收消息:msg_52
接收消息:msg_54
接收消息:msg_56
接收消息:msg_58
接收消息:msg_60
接收消息:msg_62
接收消息:msg_64
接收消息:msg_66
接收消息:msg_68
接收消息:msg_70
接收消息:msg_72
接收消息:msg_74
接收消息:msg_76
接收消息:msg_78
接收消息:msg_80
接收消息:msg_82
接收消息:msg_84
接收消息:msg_86
接收消息:msg_88
接收消息:msg_90
接收消息:msg_92
接收消息:msg_94
接收消息:msg_96
接收消息:msg_98

第二个消费者:

D:\Java\jdk1.8.0_112\bin\java "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\lib\idea_rt.jar=50388:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_112\jre\lib\charsets.jar;D:\Java\jdk1.8.0_112\jre\lib\deploy.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_112\jre\lib\javaws.jar;D:\Java\jdk1.8.0_112\jre\lib\jce.jar;D:\Java\jdk1.8.0_112\jre\lib\jfr.jar;D:\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_112\jre\lib\jsse.jar;D:\Java\jdk1.8.0_112\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_112\jre\lib\plugin.jar;D:\Java\jdk1.8.0_112\jre\lib\resources.jar;D:\Java\jdk1.8.0_112\jre\lib\rt.jar;F:\Users\Neil\IdeaProjects\jsmtest\target\classes;D:\Java\maven\repos\org\apache\activemq\activemq-all\5.15.3\activemq-all-5.15.3.jar com.happybks.jms.AppConsumer
接收消息:msg_1
接收消息:msg_3
接收消息:msg_5
接收消息:msg_7
接收消息:msg_9
接收消息:msg_11
接收消息:msg_13
接收消息:msg_15
接收消息:msg_17
接收消息:msg_19
接收消息:msg_21
接收消息:msg_23
接收消息:msg_25
接收消息:msg_27
接收消息:msg_29
接收消息:msg_31
接收消息:msg_33
接收消息:msg_35
接收消息:msg_37
接收消息:msg_39
接收消息:msg_41
接收消息:msg_43
接收消息:msg_45
接收消息:msg_47
接收消息:msg_49
接收消息:msg_51
接收消息:msg_53
接收消息:msg_55
接收消息:msg_57
接收消息:msg_59
接收消息:msg_61
接收消息:msg_63
接收消息:msg_65
接收消息:msg_67
接收消息:msg_69
接收消息:msg_71
接收消息:msg_73
接收消息:msg_75
接收消息:msg_77
接收消息:msg_79
接收消息:msg_81
接收消息:msg_83
接收消息:msg_85
接收消息:msg_87
接收消息:msg_89
接收消息:msg_91
接收消息:msg_93
接收消息:msg_95
接收消息:msg_97
接收消息:msg_99

我们可以看到在P2P模式下,两个监听队列的消费者“均分”队列中生产者提交的所有消息。

此时管理页面:

连接2个。前后共消费200个消息。

主题模式

这里我们直接给出发布者和订阅者的代码,可以看到整个代码与队列模式的生产者和消费者代码基本一样。不一样的是Destination的类型,主题模式下session创建的是一个Topic类型的对象。

通过Ctrl+H可以看到,Topic和Queue都是Destination接口的实现类。

发布者:

package com.happybks.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class AppProducer {

    //61616是activemq默认的服务端口,通信协议是tcp。之前的8161端口是管理页面的端口
    private static final String url="tcp://127.0.0.1:61616";
    private static final String topicName="topic-happybks";
    public static void main(String[] args) throws JMSException {
        // 1、创建ConnnectionFactoty连接工厂
        //这里使用activemq的连接工厂是由ActiveMQ的服务商提供的。(以后讲spring方式继承activemq时会用到spring提供的activemq连接工厂。)
        ConnectionFactory connectionFactory=new ActiveMQConnectionFactory(url);

        //2、创建Connection连接
        Connection connection = connectionFactory.createConnection();

        //3、启动连接
        connection.start();

        //4、创建Session会话
        //第一个参数:是否支持事务,是否在事务中处理。如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
        //第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
        //这里我们先不考虑支持事务,应答方式为自动应答
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5、创建一个目标Destination
        Destination destination = session.createTopic(topicName);

        //6、创建生产者
        MessageProducer producer = session.createProducer(destination);


        for(int i=0;i<100;i++) {
            //7、创建消息
            //JMS中有很多消息体类型
            TextMessage textMessage=session.createTextMessage("msg_"+i);
            //8、发布消息
            producer.send(textMessage);
            System.out.println("已经发送消息:"+textMessage.getText());
        }

        //9、关闭连接。如果不关闭,可能会连接耗尽,就连不上activemq了。
        connection.close();
    }

}

订阅者:

package com.happybks.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppConsumer {
    private static final String url = "tcp://127.0.0.1:61616";
    private static final String topicName = "topic-happybks";

    public static void main(String[] args) throws JMSException {
        // 1、创建ConnnectionFactoty连接工厂
        //这里使用activemq的连接工厂是由ActiveMQ的服务商提供的。(以后讲spring方式继承activemq时会用到spring提供的activemq连接工厂。)
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

        //2、创建Connection连接
        Connection connection = connectionFactory.createConnection();

        //3、启动连接
        connection.start();

        //4、创建Session会话
        //第一个参数:是否支持事务,是否在事务中处理。如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
        //第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
        //这里我们先不考虑支持事务,应答方式为自动应答
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5、创建一个目标Destination
        Destination destination = session.createTopic(topicName);

        //6、创建消费者
        final MessageConsumer consumer = session.createConsumer(destination);

        //7、创建监听器
        consumer.setMessageListener(new MessageListener() {
            //覆盖实现的onMessage方法里面会回调接收消息内容
            @Override
            public void onMessage(Message message) {
                //我们之前发送的消息是TextMessage类型的消息,这里类型做个转换
                TextMessage textMessage=(TextMessage)message;
                try {
                    System.out.println("接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });


        //8、关闭连接。
        // 这里不要急着关闭连接,因为消息的接收是一个异步的过程,通过前面设置的MessageListener完成,如果我们这里立即关闭连接,就接收不到消息了。
        //在实际应用中,连接关闭最好在程序停止时关闭。
        //connection.close();
    }
}

然后我们运行试试。

这里我们做两组实验直接看结果吧:

运行顺序 运行结果 结论
先开一个发布者,再开一个订阅者 看附录1 在主题模式下,订阅者只能接受topic中它订阅之后的消息,订阅之前的消息无法接收。
先开两个订阅者,再开一个发布者 看附录2 在主题模式下,若一个主题已经被多个订阅者订阅,该主题的所有订阅者都能够接收到主题发送的每一条消息。

附录1:

运行结果:

先运行一个发布者:

在运行一个订阅者:

在主题模式下,订阅者只能接受topic中它订阅之后的消息,订阅之前的消息无法接收。

附录2:

先运行一个订阅者,订阅者运行等待;

再运行一个订阅者,第二个订阅者也运行等待;

在运行一个发布者发布100个消息到主题。

此时前面两个订阅者都接收到了完整的消息,且一模一样:

订阅者1:

D:\Java\jdk1.8.0_112\bin\java "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\lib\idea_rt.jar=59688:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_112\jre\lib\charsets.jar;D:\Java\jdk1.8.0_112\jre\lib\deploy.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_112\jre\lib\javaws.jar;D:\Java\jdk1.8.0_112\jre\lib\jce.jar;D:\Java\jdk1.8.0_112\jre\lib\jfr.jar;D:\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_112\jre\lib\jsse.jar;D:\Java\jdk1.8.0_112\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_112\jre\lib\plugin.jar;D:\Java\jdk1.8.0_112\jre\lib\resources.jar;D:\Java\jdk1.8.0_112\jre\lib\rt.jar;F:\Users\Neil\IdeaProjects\jsmtest\target\classes;D:\Java\maven\repos\org\apache\activemq\activemq-all\5.15.3\activemq-all-5.15.3.jar com.happybks.jms.topic.AppConsumer
接收消息:msg_0
接收消息:msg_1
接收消息:msg_2
接收消息:msg_3
接收消息:msg_4
接收消息:msg_5
接收消息:msg_6
接收消息:msg_7
接收消息:msg_8
接收消息:msg_9
接收消息:msg_10
接收消息:msg_11
接收消息:msg_12
接收消息:msg_13
接收消息:msg_14
接收消息:msg_15
接收消息:msg_16
接收消息:msg_17
接收消息:msg_18
接收消息:msg_19
接收消息:msg_20
接收消息:msg_21
接收消息:msg_22
接收消息:msg_23
接收消息:msg_24
接收消息:msg_25
接收消息:msg_26
接收消息:msg_27
接收消息:msg_28
接收消息:msg_29
接收消息:msg_30
接收消息:msg_31
接收消息:msg_32
接收消息:msg_33
接收消息:msg_34
接收消息:msg_35
接收消息:msg_36
接收消息:msg_37
接收消息:msg_38
接收消息:msg_39
接收消息:msg_40
接收消息:msg_41
接收消息:msg_42
接收消息:msg_43
接收消息:msg_44
接收消息:msg_45
接收消息:msg_46
接收消息:msg_47
接收消息:msg_48
接收消息:msg_49
接收消息:msg_50
接收消息:msg_51
接收消息:msg_52
接收消息:msg_53
接收消息:msg_54
接收消息:msg_55
接收消息:msg_56
接收消息:msg_57
接收消息:msg_58
接收消息:msg_59
接收消息:msg_60
接收消息:msg_61
接收消息:msg_62
接收消息:msg_63
接收消息:msg_64
接收消息:msg_65
接收消息:msg_66
接收消息:msg_67
接收消息:msg_68
接收消息:msg_69
接收消息:msg_70
接收消息:msg_71
接收消息:msg_72
接收消息:msg_73
接收消息:msg_74
接收消息:msg_75
接收消息:msg_76
接收消息:msg_77
接收消息:msg_78
接收消息:msg_79
接收消息:msg_80
接收消息:msg_81
接收消息:msg_82
接收消息:msg_83
接收消息:msg_84
接收消息:msg_85
接收消息:msg_86
接收消息:msg_87
接收消息:msg_88
接收消息:msg_89
接收消息:msg_90
接收消息:msg_91
接收消息:msg_92
接收消息:msg_93
接收消息:msg_94
接收消息:msg_95
接收消息:msg_96
接收消息:msg_97
接收消息:msg_98
接收消息:msg_99

订阅者2:

D:\Java\jdk1.8.0_112\bin\java "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\lib\idea_rt.jar=59695:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_112\jre\lib\charsets.jar;D:\Java\jdk1.8.0_112\jre\lib\deploy.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_112\jre\lib\javaws.jar;D:\Java\jdk1.8.0_112\jre\lib\jce.jar;D:\Java\jdk1.8.0_112\jre\lib\jfr.jar;D:\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_112\jre\lib\jsse.jar;D:\Java\jdk1.8.0_112\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_112\jre\lib\plugin.jar;D:\Java\jdk1.8.0_112\jre\lib\resources.jar;D:\Java\jdk1.8.0_112\jre\lib\rt.jar;F:\Users\Neil\IdeaProjects\jsmtest\target\classes;D:\Java\maven\repos\org\apache\activemq\activemq-all\5.15.3\activemq-all-5.15.3.jar com.happybks.jms.topic.AppConsumer
接收消息:msg_0
接收消息:msg_1
接收消息:msg_2
接收消息:msg_3
接收消息:msg_4
接收消息:msg_5
接收消息:msg_6
接收消息:msg_7
接收消息:msg_8
接收消息:msg_9
接收消息:msg_10
接收消息:msg_11
接收消息:msg_12
接收消息:msg_13
接收消息:msg_14
接收消息:msg_15
接收消息:msg_16
接收消息:msg_17
接收消息:msg_18
接收消息:msg_19
接收消息:msg_20
接收消息:msg_21
接收消息:msg_22
接收消息:msg_23
接收消息:msg_24
接收消息:msg_25
接收消息:msg_26
接收消息:msg_27
接收消息:msg_28
接收消息:msg_29
接收消息:msg_30
接收消息:msg_31
接收消息:msg_32
接收消息:msg_33
接收消息:msg_34
接收消息:msg_35
接收消息:msg_36
接收消息:msg_37
接收消息:msg_38
接收消息:msg_39
接收消息:msg_40
接收消息:msg_41
接收消息:msg_42
接收消息:msg_43
接收消息:msg_44
接收消息:msg_45
接收消息:msg_46
接收消息:msg_47
接收消息:msg_48
接收消息:msg_49
接收消息:msg_50
接收消息:msg_51
接收消息:msg_52
接收消息:msg_53
接收消息:msg_54
接收消息:msg_55
接收消息:msg_56
接收消息:msg_57
接收消息:msg_58
接收消息:msg_59
接收消息:msg_60
接收消息:msg_61
接收消息:msg_62
接收消息:msg_63
接收消息:msg_64
接收消息:msg_65
接收消息:msg_66
接收消息:msg_67
接收消息:msg_68
接收消息:msg_69
接收消息:msg_70
接收消息:msg_71
接收消息:msg_72
接收消息:msg_73
接收消息:msg_74
接收消息:msg_75
接收消息:msg_76
接收消息:msg_77
接收消息:msg_78
接收消息:msg_79
接收消息:msg_80
接收消息:msg_81
接收消息:msg_82
接收消息:msg_83
接收消息:msg_84
接收消息:msg_85
接收消息:msg_86
接收消息:msg_87
接收消息:msg_88
接收消息:msg_89
接收消息:msg_90
接收消息:msg_91
接收消息:msg_92
接收消息:msg_93
接收消息:msg_94
接收消息:msg_95
接收消息:msg_96
接收消息:msg_97
接收消息:msg_98
接收消息:msg_99

我们此时再看管理页面activemq的topic页面:(前面我其实多点过1次,所以是300;刚才两个实验消费接收了200个)

猜你喜欢

转载自my.oschina.net/happyBKs/blog/1815056
今日推荐