文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何进行ActiveMQ的简单入门与使用

2023-06-21 21:08

关注

这期内容当中小编将会给大家带来有关如何进行ActiveMQ的简单入门与使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、什么是消息中间件

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

如何进行ActiveMQ的简单入门与使用

二、什么是ActiveMQ

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

三、什么时候需要用ActiveMQ

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

如何进行ActiveMQ的简单入门与使用

四、如何使用ActiveMQ

AcitveMQ的数据传送流程

如何进行ActiveMQ的简单入门与使用

ActiveMQ的两种消息传递类型

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

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

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

ActiveMQ的安装与启动

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

如何进行ActiveMQ的简单入门与使用

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

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

如何进行ActiveMQ的简单入门与使用

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

如何进行ActiveMQ的简单入门与使用

(5)启动错误分析

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

ActiveMQ的代码测试

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

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

(2)生产者类

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条消息在队列中等待消费

如何进行ActiveMQ的简单入门与使用

(3)消费者类

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待消费了

如何进行ActiveMQ的简单入门与使用

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

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

// Consumer1控制台

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

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

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

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

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

// Consumer2控制台

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

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

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

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

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

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

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

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();    }}
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的简单入门与使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯