学习ActiveMQ(二):点对点(队列)模式消息演示
一:介绍
点对点的消息发送方式主要建立在 消息(Message ),队列(Queue),发送者(Sender),消费者(receiver)上,Queue 存贮消息,Sender 发送消息,receive接收消息.具体点就是Sender Client通过Queue发送message ,而 receiver Client从Queue中接收消息。消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行。
二:了解jms编码接口之间的关系
可以看到我们需要先创建连接工厂,再通过连接工厂创建连接,在通过连接创建session,在通过session创建生产者、消费者和消息。destination为目的源,下面代码有具体体现。
三:创建实例
1.打开IDEA,创建一个ActiveMQ的maven项目,如下图:
2.自己新创建两个java文件,appConsumer消费者类和appProducer生产者类,项目结构如下图:
3.生产者代码如下:
1 package com.liu.jms; 2 3 import org.apache.activemq.ActiveMQConnectionFactory; 4 5 import javax.jms.*; 6 7 public class appProducer { 8 9 private static final String url = "tcp://127.0.0.1:61616";//actvemq的服务器tcp连接方式 10 private static final String queueName = "queue-test";//定义队列的名称 11 12 public static void main(String[] args) throws JMSException { 13 //1.创建connectionFactory 14 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 15 //2.创建connection 16 Connection connection = connectionFactory.createConnection(); 17 //3.启动连接 18 connection.start(); 19 //4.创建session 20 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 21 //5.创建destination 22 Destination destination = session.createQueue(queueName); 23 //6.创建生产者 24 MessageProducer producer = session.createProducer(destination); 25 26 for (int i = 0; i < 100; i++) { 27 28 TextMessage textMessage = session.createTextMessage("test" + i); 29 //7.发送消息 30 producer.send(textMessage); 31 32 System.out.println("发送消息" + textMessage.getText()); 33 34 } 35 //8.关闭连接 36 connection.close(); 37 } 38 }
如代码所示,通过tcp方式连接了服务端,(别忘了启动服务端的服务)。然后创建了一个生产者,这个生产者绑定了一个以名为queueName队列为目的源,代表着这个生产者的消息会发到这个消息队列上面去。然后通过for循环发送了一百个消息。
4.消费者代码如下:
package com.liu.jms; 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-test"; public static void main(String[] args) throws JMSException { //1.创建connectionFactory ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); //2.创建connection Connection connection = connectionFactory.createConnection(); //3.启动连接 connection.start(); //4.创建session Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //5.创建destination Destination destination = session.createQueue(queueName); //6.创建消费者 MessageConsumer consumer = session.createConsumer(destination); //7.创建一个监听器 consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message; try { System.out.println("接收到的消息:" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); //8.关闭连接(监听器是异步的还没有监听到消息的时候,就关闭连接了) //connection.close(); } }
如代码所示:消费者和生产者不同的是,消费需要建立一个监听器,来监听以名为queueName的队列上是否有了消息,有消息就会接受,然后通过onMessage方法对消息进行处理。
5.测试
首先启动消费者这个java类,观察控制台,如下图:
接着启动生产者的java类,观察控制台,如下图:生产了一百条消息。
此时切换至消费的控制台,观察控制台,如下图:已经打印出了一百条消息了,说明消费者已经接受到全部一百条消息。
6.打开activemq的控制台查看Queues:(http://127.0.0.1:8161/admin/queues.jsp)如下图所示:队列有一个名字是我们设置的queue-test,消费者也有一个就是我们创建的那个消费者类,队列中有一百条消息,被移除了一百条,也就是上面所说的,消费者接收到了这100条全部的消息。
通过这个简单的小demo我们已经实现了点对点的通信方式。下一节学习订阅发布模式。
- 这或许是对小白最友好的python入门了吧——18,定义函数
- 【深度学习】图片风格转换应用程序:使用CoreML创建Prisma
- 压力测试中存在的问题
- 这或许是对小白最友好的python入门了吧——18,用while循环处理列表
- 如何在js中将统计代码图标隐藏
- 警惕IT黑洞
- 这或许是对小白最友好的python入门了吧——17,while循环
- 泛型介绍(接上一篇,具体的事例随后呈上)
- PHP高级编程之守护进程
- 看到他我一下子就悟了-- 泛型(2)
- ExtJS4中设置tabpanel的tab高度问题
- Oracle写错误与文件离线
- 看到他我一下子就悟了-- 泛型(1)
- EXTJS4 Grid Filter 插件的使用 与后台数据解析------Extjs 查询筛选功能的实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 神经网络架构搜索——可微分搜索(DARTS)
- 神经网络架构搜索——可微分搜索(P-DARTS)
- 神经网络架构搜索——可微分搜索(PC-DARTS)
- 反编译小程序记录
- 使用Selenium WebDriver,Python和Chrome编写您的第一个Web测试
- 神经网络架构搜索——可微分搜索(SGAS)
- 神经网络架构搜索——可微分搜索(Fair-DARTS)
- 一帧图像的Android之旅 :应用的首个绘制请求
- Mac免密码登录linux服务器
- 目标检测算法YOLO-V2详解
- 神经网络架构搜索——可微分搜索(Noisy DARTS)
- 教你使用 Jacoco 统计服务端代码覆盖率
- 如何在树莓派4B上设置EMQX开机自启动
- 如何使用 Ktor 快速开发 Web 项目
- 神经网络架构搜索——二值可微分搜索(BATS)