ActiveMQ消息传递的两种方式
1.什么是ActiveMQ?
ActiveMQ是apache提供的开源的,实现消息传递的一个中间插件,可以和spring整合,是目前最流行的开源消息总线,ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。较相似的还有rabbitMQ和kafka等,都是最为消息传递的插件
2.ActiveMQ传递消息的两种方式
前提:需要引入activemq的jar包
点对点方式(PTP):一个消费者对应一个生产者
发布/订阅模式(Publish/Sub):一个生产者产生消息发送后,可以被多个消费者进行接收。
JMS定义了五种消息正文格式,以及消息的调用类型,允许发送和接收一些不同类型的数据,提供现有消息格式的一些级别的兼容性。
StreamMessage:--JAVA原始的数据流
TextMessage:一个字符串对象
ObjectMessage:一个系列化的java对象
BytesMessage:一个字节对象
MapMessage:key/value方式的键值对
(1)点对点的方式(PTP)
即:一个消息的生产者对应一个消费者
生产者(Producer)实现步骤:
第一步:创建一个ConnectionFactory对象,将服务端activemq的 ip 和 port 作为构造参数传递
第二步:通过第一步创建的工厂对象获得连接对象Connection
第三步:开启连接,直接调用connection对象的start方法即可
第四步:创建一个Session对象,通过connection对象创建
第五步:通过Session对象创建一个Destination对象(该对象有两种方式:topic和quene),这里使用quene
第六步:通过Session对象创建一个生产者Producer对象
第七步:创建Message对象,这里使用TextMessage对象,设置消息内容
第八步:使用创建的生产者对象Producer发送消息
第九步:关闭资源(Producer对象,Connection对象,Session对象)
@Testpublic void testQueueProducer() throws Exception {// 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。//brokerURL服务器的ip及端口号ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://ip地址:61616");// 第二步:使用ConnectionFactory对象创建一个Connection对象。Connection connection = connectionFactory.createConnection();// 第三步:开启连接,调用Connection对象的start方法。 connection.start();// 第四步:使用Connection对象创建一个Session对象。//第一个参数:是否开启事务。true:开启事务,第二个参数忽略。//第二个参数:当第一个参数为false时,才有意义。消息的应答模式。1、自动应答2、手动应答。一般是自动应答。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。//参数:队列的名称。Queue queue = session.createQueue("test-queue");// 第六步:使用Session对象创建一个Producer对象。MessageProducer producer = session.createProducer(queue);// 第七步:创建一个Message对象,创建一个TextMessage对象。/*TextMessage message = new ActiveMQTextMessage();message.setText("hello activeMq,this is my first test.");*/TextMessage textMessage = session.createTextMessage("hello activeMq,this is my first test.");// 第八步:使用Producer对象发送消息。 producer.send(textMessage);// 第九步:关闭资源。 producer.close();session.close();connection.close();}
消费者实现:
第一步:创建一个ConnectionFactory对象,将服务端activemq的 ip 和 port 作为构造参数传递
第二步:通过第一步创建的工厂对象获得连接对象Connection
第三步:开启连接,直接调用connection对象的start方法即可
第四步:创建一个Session对象,通过connection对象创建
第五步:创建一个Destination对象,使用quene,需要和生产者的quene一致
第六步:创建一个消费者对象
第七步:接收消息
第八步:打印接收的消息
第九步:关闭资源
消费者的代码:
@Testpublic void testQueueConsumer() throws Exception {// 第一步:创建一个ConnectionFactory对象。ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.168:61616");// 第二步:从ConnectionFactory对象中获得一个Connection对象。Connection connection = connectionFactory.createConnection();// 第三步:开启连接。调用Connection对象的start方法。 connection.start();// 第四步:使用Connection对象创建一个Session对象。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。Queue queue = session.createQueue("test-queue");// 第六步:使用Session对象创建一个Consumer对象。MessageConsumer consumer = session.createConsumer(queue);// 第七步:接收消息。consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {try {TextMessage textMessage = (TextMessage) message;String text = null;//取消息的内容text = textMessage.getText();// 第八步:打印消息。 System.out.println(text);} catch (JMSException e) {e.printStackTrace();}}});//等待键盘输入 System.in.read();// 第九步:关闭资源 consumer.close();session.close();connection.close();}
View Code
(2)订阅发布方式传递消息:Topic
补充:由于topic传递消息的特点是,一个生产者可以有多个消费者,生产者生产的消息在没有被消费者消费之前,并不会将消息持久化到activemq的服务端,发送的消息会自动消失。所以 测试的时候需要先创建消费者对象,然后在发送消息,防止消息丢失。
生产者实现步骤:
步骤和PTP的方式完全一样,不同的是在创建Destination对象的时候,需要创建topic对象
直接上代码:
@Testpublic void testTopicProducer() throws Exception {// 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。// brokerURL服务器的ip及端口号ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://IP地址:61616");// 第二步:使用ConnectionFactory对象创建一个Connection对象。Connection connection = connectionFactory.createConnection();// 第三步:开启连接,调用Connection对象的start方法。 connection.start();// 第四步:使用Connection对象创建一个Session对象。// 第一个参数:是否开启事务。true:开启事务,第二个参数忽略。// 第二个参数:当第一个参数为false时,才有意义。消息的应答模式。1、自动应答2、手动应答。一般是自动应答。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个topic对象。// 参数:话题的名称。Topic topic = session.createTopic("test-topic");// 第六步:使用Session对象创建一个Producer对象。MessageProducer producer = session.createProducer(topic);// 第七步:创建一个Message对象,创建一个TextMessage对象。/** TextMessage message = new ActiveMQTextMessage(); message.setText(* "hello activeMq,this is my first test.");*/TextMessage textMessage = session.createTextMessage("hello activeMq,this is my topic test");// 第八步:使用Producer对象发送消息。 producer.send(textMessage);// 第九步:关闭资源。 producer.close();session.close();connection.close();}
View Code
消费者实现的步骤:
步骤和PTP消费者实现的步骤一样,唯一不同的是在创建Destination对象的时候,创建topic对象,同时要和发布订阅的生产者的topic一致
消费者代码:
@Testpublic void testTopicConsumer() throws Exception {// 第一步:创建一个ConnectionFactory对象。ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://IP地址:61616");// 第二步:从ConnectionFactory对象中获得一个Connection对象。Connection connection = connectionFactory.createConnection();// 第三步:开启连接。调用Connection对象的start方法。 connection.start();// 第四步:使用Connection对象创建一个Session对象。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 第五步:使用Session对象创建一个Destination对象。和发送端保持一致topic,并且话题的名称一致。Topic topic = session.createTopic("test-topic");// 第六步:使用Session对象创建一个Consumer对象。MessageConsumer consumer = session.createConsumer(topic);// 第七步:接收消息。consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {try {TextMessage textMessage = (TextMessage) message;String text = null;// 取消息的内容text = textMessage.getText();// 第八步:打印消息。 System.out.println(text);} catch (JMSException e) {e.printStackTrace();}}});System.out.println("topic的消费端03。。。。。");// 等待键盘输入 System.in.read();// 第九步:关闭资源 consumer.close();session.close();connection.close();}
View Code
总结:两种传递消息的方式的异同
相同点:实现步骤基本一样,大同小异
不同点:PTP传递消息的方法,消息的生产者发送以后,消息会持久化在activemq的服务端,如果该消息给消费者消费,在服务端持久化的消息也就同时被删除。
发布订阅传递消息的方法:消息的生产者发送消息以后,如果没有消费者消费,消息不会持久化在activemq的客户端,会立即消失。如果创建的消息被消费,会的activemq的服务端显示消息相关内容。这一点和PTP刚好相反。
注意:发布订阅传递消息的方式:也是可以实现消息持久化在服务端的,需要消费者首先在activemq的服务端订阅消息(注册),将消费者客户端的ID(作为唯一标识,因为可以有多个消费者)和消息的ID传递给服务端即可。
转载于:https://www.cnblogs.com/shuai-server/p/8966299.html
ActiveMQ消息传递的两种方式相关推荐
- javax消息队列_java实现消息队列的两种方式(小结)
实现消息队列的两种方式 Apache ActiveMQ官方实例发送消息 下载解压后拿到java代码实例 然后倒入IDE 如下: 请认真阅读readme.md文件,大致意思就是把项目打成两个jar包,然 ...
- 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题
继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...
- 周一02.3运行python程序的两种方式
一.运行python程序的两种方式 方法一:交互式: 优点:输入一行代码立刻返回结果 缺点:无法永久保存代码 方法 ...
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...
- android不调用系统发送短信,android之两种方式调用短信发送接口
释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...
- android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...
本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...
- VS Code - Debugger for Chrome调试JavaScript的两种方式
VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故,博客写的不是很多,一直想写一篇VS Code - Debugger for Chrom ...
- 简单介绍python连接telnet和ssh的两种方式
本文主要介绍了python连接telnet和ssh的两种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Telnet 连接方式 #!/usr/bin/env p ...
- 简单介绍MySQL开启事务的两种方式
本篇文章给大家分享MySQL 是如何开启一个事务的,原文通过两种方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧 方式 1 START TRANSACTION 或 ...
最新文章
- 人民大学提出听音识物AI框架,不用人工标注,嘈杂环境也能Hold住,还可迁移到物体检测...
- 【IM】关于迁移学习的理解
- python-mysql驱动64位
- ​如何实现简单高效的移动剪辑框架
- C++编译报错:重复定义
- torchtext 各种数据集加载
- Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力
- [Swift]LeetCode70. 爬楼梯 | Climbing Stairs
- dirent.h简介
- webApplicationContext 与servletContext
- selenium安装包_??《手把手教你》系列基础篇之1-python+ selenium自动化测试-环境搭建(详细)...
- CAS4搭建HTTP环境
- 817c语言程序设计,全国名校C语言程序设计考研真题汇编
- android ppt的动画效果怎么做,Android 仿 PPT 进入动画效果合集
- iPad 被锁死后如何恢复出厂设置
- 安装set 安装ptf框架
- 阿里巴巴图标库iconfont的使用
- 在线引流工具Tcpcopy原理、环境搭建、使用、采坑
- python开发数据库_有没有利用python开发数据库的案例
- 解决中国大学MOOC遮挡字幕问题
热门文章
- Pathlib获取当前文件绝对路径
- python中的带有换行符的字符串在juypter中直接输入、print与写入文件的区别
- java工程引用其他工程,Android工程:引用另一个Android工程的方法详解
- python安装whl_EN-mysqlclient库安装问题
- python中使用格式化字符串
- 编程实现 4 条重写规则,可生成半法式和法式
- 笔记-高项案例题-2016年下-计算题
- Leaflet中自定义marker的icon图标
- PowerDesigner逆向工程从SqlServer数据库生成PDM(图文教程)
- SpringBoot中使用thymeleaf的switch来实现if-else if -else的效果