ActiveMQ的简单入门介绍与使用

一、什么是消息中间件

消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传送

二、什么是ActiveMQ

ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。

三、什么时候需要用ActiveMQ

ActiveMQ常被应用与系统业务的解耦,异步消息的推送,增加系统并发量,提高用户体验。例如以我在工作中的使用,在比较耗时且异步的远程开锁操作时

四、如何使用ActiveMQ

1.AcitveMQ的数据传送流程

2.ActiveMQ的两种消息传递类型

(1)点对点传输,即一个生产者对应一个消费者,生产者向broke推送数据,数据存储在broke的一个队列中,当消费者接受该条队列里的数据。

(2)基于发布/订阅模式的传输,即根据订阅话题来接收相应数据,一个生产者可向多个消费者推送数据,与MQTT协议的实现是类似的,对MQTT协议有兴趣的可跳转到https://www.cnblogs.com/xiguadadage/p/11216463.html

两种消息传递类型的不同,点对点传输消费者可以接收到在连接之前生产者所推送的数据,而基于发布/订阅模式的传输方式消费者只能接收到连接之后生产者推送的数据。

3.ActiveMQ的安装与启动

(1)官网下载对应服务器版本

(2)解压后进入apache-activemq-5.15.9/bin目录

(3)执行./activemq start启动ActiveMQ

(4)浏览器输入ActiveMQ启动的服务器ip:8161便可进入web界面,点击Manage ActiveMQ broker可以查看消息推送的状态,默认账号密码为admin,admin

(5)启动错误分析

进入/root/apache-activemq-5.15.9/data目录查看activemq.log文件,根据错误提示信息修改,例如端口号被占用等。

4.ActiveMQ的代码测试

(1)构建maven项目,引入依赖

<dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.9.0</version>
        </dependency>

(2)生产者类

/**
 * @Description 生产者
 * @Date 2019/7/20
 * @Created by yqh
 */
public class MyProducer {

    private static final String ACTIVEMQ_URL = "tcp://192.168.168.242:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createQueue("myQueue");
        // 创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        // 向队列推送10个文本消息数据
        for (int i = 1 ; i <= 10 ; i++){
            // 创建文本消息
            TextMessage message = session.createTextMessage("第" + i + "个文本消息");
            //发送消息
            producer.send(message);
            //在本地打印消息
            System.out.println("已发送的消息:" + message.getText());
        }
        //关闭连接
        connection.close();
    }

}

运行结果:

已发送的消息:第1个文本消息

已发送的消息:第2个文本消息

已发送的消息:第3个文本消息

已发送的消息:第4个文本消息

已发送的消息:第5个文本消息

已发送的消息:第6个文本消息

已发送的消息:第7个文本消息

已发送的消息:第8个文本消息

已发送的消息:第9个文本消息

已发送的消息:第10个文本消息

测试查看web后台显示,有10条消息在队列中等待消费

(3)消费者类

/**
 * @Description 消费者类
 * @Date 2019/7/20 0020
 * @Created by yqh
 */
public class MyConsumer {

    private static final String ACTIVEMQ_URL = "tcp://192.168.168.242:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createQueue("myQueue");
        // 创建消费者
        MessageConsumer consumer = session.createConsumer(destination);
        // 创建消费的监听
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消费的消息:" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

测试结果:

消费的消息:第1个文本消息

消费的消息:第2个文本消息

消费的消息:第3个文本消息

消费的消息:第4个文本消息

消费的消息:第5个文本消息

消费的消息:第6个文本消息

消费的消息:第7个文本消息

消费的消息:第8个文本消息

消费的消息:第9个文本消息

消费的消息:第10个文本消息

web后台显示有一个消费者处于连接状态,且已消费了10个message,而该条队列已没有message待消费了

(4)当我们运行两个消费者类,消息又是怎么被消费的呢?是两个消费者都能收到生产者生产的message,还是只有其中一个消费者能消费呢?

我们先运行两个消费者,在运行一个生产者对目标队列生产10个message,会发现有以下情况

// Consumer1控制台

消费的消息:第1个文本消息

消费的消息:第3个文本消息

消费的消息:第5个文本消息

消费的消息:第7个文本消息

消费的消息:第9个文本消息

// Consumer2控制台

消费的消息:第2个文本消息

消费的消息:第4个文本消息

消费的消息:第6个文本消息

消费的消息:第8个文本消息

消费的消息:第10个文本消息

即队列中的数据会平均的分给每一个消费者消费,且每一条数据只能被消费一次

(5)以上是基于队列点对点的传输类型,以下是基于发布/订阅模式传输的类型测试

/**
 * @Description 基于发布/订阅模式传输类型的生产者测试
 * @Date 2019/7/20 0020
 * @Created by yqh
 */
public class MyProducerForTopic {

    private static final String ACTIVEMQ_URL = "tcp://192.168.168.242:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createTopic("topicTest");
        // 创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        // 向队列推送10个文本消息数据
        for (int i = 1 ; i <= 10 ; i++){
            // 创建文本消息
            TextMessage message = session.createTextMessage("第" + i + "个文本消息");
            //发送消息
            producer.send(message);
            //在本地打印消息
            System.out.println("已发送的消息:" + message.getText());
        }
        //关闭连接
        connection.close();
    }

}
/**
 * @Description 基于发布/订阅模式传输类型的消费者测试
 * @Date 2019/7/20 0020
 * @Created by yqh
 */
public class MyConsumerForTopic {

    private static final String ACTIVEMQ_URL = "tcp://192.168.168.242:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createTopic("topicTest");
        // 创建消费者
        MessageConsumer consumer = session.createConsumer(destination);
        // 创建消费的监听
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消费的消息:" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

现在如果我们先启动生产者,再启动消费者,会发现消费者是无法接收到之前生产者之前所生产的数据,只有消费者先启动,再让生产者消费才可以正常接收数据,这也是发布/订阅的主题模式与点对点的队列模式的一个明显区别。

而如果启动两个消费者,那么每一个消费者都能完整的接收到生产者生产的数据,即每一条数据都被消费了两次,这是发布/订阅的主题模式与点对点的队列模式的另一个明显区别。

总结

到此这篇关于ActiveMQ的简单入门介绍与使用的文章就介绍到这了,更多相关ActiveMQ介绍与使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ActiveMQ简单入门(新手必看篇)

    一.创建一个简单的Hello World案例 首先需要导入activemq-all-5.14.5.jar包,写生产端: package com.ietree.mq.helloworld; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.MessageProduc

  • ActiveMQ安装及部署教程图解

    ActiveMQ是Apache的一个开源项目,它是一个功能强劲的开源消息总线,也是一个中间件产品,它是JMS的一个实现. 在介绍ActiveMQ之前,先来复习一下J2EE中的JMS规范.JMS 即Java消息服务应用程序接口,是Java Message Service的缩写,是一个Java平台中关于面向消息中间件(manager of managers,缩写为MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信:我们可以利用它在不同系统和不同的模块之间实现集成.Java

  • 解析ActiveMQ的使用说明总结

    本文只针对ActiveMQ常见的一些问题进行介绍.关于如下下载.编译.部署.使用等基本应用不在本文范围内. 1.ActiveMQ支持消息过滤设置规则和用法 selector支持下列几种方式: (1) String literals: "color ='blue'" (2) Byte strings: "myBytes <> "0X0AFC23"" (3) Numeric values: "NoltemsInStock >

  • ActiveMQ的简单入门介绍与使用

    一.什么是消息中间件 消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传送 二.什么是ActiveMQ ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件. 三.什么时候需要用ActiveMQ ActiveMQ常被应用与系统业务的解耦,异步消息的推送,增加系统并发量,提高用户体验.例如以我在工作中的使用,在比较耗时且异步的远程开

  • Git 教程简单入门介绍

    许多人认为Git太混乱,或认为它是一种复杂的版本控制系统,其实不然,这篇文章有助于大家快速上手使用Git. 入门 使用Git前,需要先建立一个仓库(repository).您可以使用一个已经存在的目录作为Git仓库或创建一个空目录. 使用您当前目录作为Git仓库,我们只需使它初始化. git init 使用我们指定目录作为Git仓库. git init newrepo 从现在开始,我们将假设您在Git仓库根目录下,除非另有说明. 添加新文件 我们有一个仓库,但什么也没有,可以使用add命令添加文

  • Node.js和Express简单入门介绍

    仅仅入门如何用Node.js和Express搭建一个web服务器,没有说明太多概念性的东西. 一. Nodejs简介 ​ ==Node是JavaScript语言的服务器运行环境.== ​ 所谓"运行环境"有两层意思:首先,JavaScript语言通过Node在服务器运行,在这个意义上,Node有点像JavaScript虚拟机:其次,Node提供大量工具库,使得JavaScript语言与操作系统互动(比如读写文件.新建子进程),在这个意义上,Node又是JavaScript的工具库. ​

  • 不错的JavaScript面向对象的简单入门介绍第1/2页

    1) 如何创建对象: 1. 使用constructor,例如: var obj = new Object() // var 可以省略 var obj = new Date() 2. 使用对象字面值(object literals),例如: 程序代码 var obj = "123" // 创建一个String对象 var obj = /^abc$/ //创建一个RegExp对象 更加复杂的情况是,我们可以直接生成一个自定义的只有属性的对象: 程序代码 var obj = { name:&

  • URLRewriter最简单入门介绍 URLRewriter相关资源

    1. URLRewriter 相关资源:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msihttp://msdn.microsoft.com/zh-cn/library/ms972974.aspxhttp://blog.csdn.net/chenghp/archive/2007/04/10/1559212.aspx 2. URLRewriter

  • MyBatis入门介绍(超简单)

    MyBatis 简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects

  • python对RabbitMQ的简单入门使用教程

    目录 (一)RabbitMQ的简介 (二)RabbitMQ的安装 (三)python操作RabbitMQ (四)RabbitMQ简单模式 (五)RabbitMQ发布订阅模式 (六)RabbitMQ RPC模式 (七)说点啥 (八)结语 (一)RabbitMQ的简介 RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信.而作为中间件的 RabbitMq 无疑是目前最

  • Ruby入门介绍第1/5页

    一.方法 Ruby 的方法定义允许为参数设置默认值,不过在带有默认值的参数后面不能出现不带有默认值的参数(允许 * 和 &),也就是说下面的方法定义是不被允许的,解释时会出现 parse error. 还有一点与 C# 不同的是,方法定义不能出现在方法调用的后面. # parse error def Display(args1="proshea", args2) end # 允许 def Display(args1="proshea", *args2) en

  • jQuery简单入门示例之用户校验demo示例

    本文实例讲述了jQuery简单入门示例之用户校验.分享给大家供大家参考,具体如下: jQuery在小编的世界中,也就是JavaScript和查询(Query),即是辅助JavaScript开发的库,百度百科对JQuery的介绍比较详细,小伙伴可以东东自己可耐的小爪子,上网进行搜索,说不定,有意外惊喜哦,今天这篇文章,小编简单的介绍一下JQuery的一些基本知识,然后小编在集合实例,讲解一下在具体的应用过程中,我们的JQuery又是如何在她的舞台熠熠生辉...... 通过JQuery的学习,我们可

随机推荐