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

安装ActiveMQ

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

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

214333_1B4Z_1156339.png

里面包含这样几个文件:

214448_yvVS_1156339.png

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

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

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

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

215154_6djQ_1156339.png

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

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

215404_t3Cs_1156339.png

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

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

点击Manage ActiveMQ broker

215623_PMOM_1156339.png

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

215718_XNKF_1156339.png

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

215742_txlI_1156339.png

 

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

使用JMS接口规范连接ActiveMQ

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

创建生产者

创建消费者

创建发布者

创建订阅者

 

224804_sJfZ_1156339.png

 

建立项目

211729_OKoL_1156339.png

(本文出自oschina博主happybks的博文:https://my.oschina.net/happyBKs/blog/1815056)

213521_zhOF_1156339.png

导入依赖:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.happybks.jms</groupId>
    <artifactId>jsmtest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>jsmtest</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.15.3</version>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

 

队列模式

我们先编写一个生产者客户端程序类:试着插入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页面,可以看到初始时没有任何连接。

211309_RKtJ_1156339.png

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

211459_lhBJ_1156339.png

然后我们运行程序AppProducer

215431_avGS_1156339.png

我们再看active的管理页面:

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

 

215508_eBLB_1156339.png

 

 

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

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的连接未关闭,仍然在监听。

225931_o5gC_1156339.png

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

225916_Bqz0_1156339.png

 

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

225944_zlcF_1156339.png

 

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

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

230521_rLUm_1156339.png

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

第一个消费者:

230635_m8qa_1156339.png

接收消息: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

第二个消费者:

230715_unHe_1156339.png

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

231017_60NZ_1156339.png

231121_Q8LG_1156339.png

 

 

主题模式

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

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

214511_J5Po_1156339.png

发布者:

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:

运行结果:

先运行一个发布者:

215257_VOOw_1156339.png

在运行一个订阅者:

215324_fGDh_1156339.png

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

 

附录2:

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

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

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

215537_oKEV_1156339.png

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

订阅者1:

215623_7Uoq_1156339.png

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:

215652_oXKR_1156339.png

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个)

215805_kWMW_1156339.png

 

 

 

转载于:https://my.oschina.net/happyBKs/blog/1815056

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值