ActiveMQ的p2p模式与发布订阅模式
1.消息中间件:采用异步通讯防止,支持点对点以及发布订阅模式,可以解决高并发问题
传统调用接口,可能发生阻塞,重复提交,超时等等问题,可以利用消息中间件发送异步通讯请求
点对点:生产者 消息队列 消费者
发布订阅:生产者 主题 消费者1 消费者N
2.windows安装ActiveMQ
2.1 解压,进入apache-activemq-5.11.1\bin\win64
2.2 启动,双击activeMQ.bat脚本启动,启动窗口不要关闭,可以设置后台启动
2.3 启动完成后,如果发送消息或者消费消息通过61616端口进行 后台查看信息通过8161端口查看
2.4 进入后台登陆:默认用户名和密码都是admin
P2P (点对点)
P2P
- P2P模式图

2. 涉及到的概念
- 消息队列(Queue)
- 发送者(Sender)
- 接收者(Receiver)
- 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
3. P2P的特点
- 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功
如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。
应用场景
A用户与B用户发送消息
案例:
生产者:
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:启动连接
connection.start();
//步骤四:获取会话工厂
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//步骤五:创建队列
Queue queue = session.createQueue("wdksoft_queue");
//创建消息生产者
MessageProducer producer = session.createProducer(queue);
//消息持久化
producer.setDeliveryMode(2);
//模拟消息
TextMessage textMessage = session.createTextMessage("hello activeMQ");
//发送消息
producer.send(textMessage);
System.out.println("生产者生产消息完毕~");
//回收资源
session.close();
connection.close();
}
消费者:
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:开启连接
connection.start();
//创建会话对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取到接受消息的队列
Queue queue = session.createQueue("wdksoft_queue");
//创建消费者
MessageConsumer consumer = session.createConsumer(queue);
while(true){
//获取消息
TextMessage message = (TextMessage)consumer.receive();
if(message!=null){
System.out.println("消费者获取消息:"+message.getText());
}else{
break;
}
}
//回收资源
session.close();
connection.close();
}

在没有消费者服务启动时,生产者生产的消息会被暂存到消息队列中,等到有消费者服务启动时,就从消息队列中取走消息
点对点的方式,生产者生产的消息只能被一个消费者获取
当有多个消费者存在时,只有一个消费者会收到消息
如果想一个生产者发布了消息,多个消费者都能接收到,需要用到另一种模式,发布与订阅模式
Pub/Sub (发布与订阅)
Pub/Sub模式图

涉及到的概念
主题(Topic)
发布者(Publisher)
订阅者(Subscriber)
客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
Pub/Sub的特点
每个消息可以有多个消费者
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
消息的消费
在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。
○ 同步
订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞
○ 异步
订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。
应用场景:
用户注册、订单修改库存、日志存储
画图演示



案例:
消费者:
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:开启连接
connection.start();
//创建会话对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取到接受消息的队列
Topic topic = session.createTopic("wdksoft_topic");
//创建消费者
MessageConsumer consumer = session.createConsumer(topic);
while(true){
//获取消息
TextMessage message = (TextMessage)consumer.receive();
if(message!=null){
System.out.println("消费者获取消息:"+message.getText());
}else{
break;
}
}
//回收资源
session.close();
connection.close();
}
生产者:
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:启动连接
connection.start();
//步骤四:获取会话工厂
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//步骤五:创建主题
Topic topic = session.createTopic("wdksoft_topic");
//创建消息生产者
MessageProducer producer = session.createProducer(null);
//消息持久化
producer.setDeliveryMode(2);
//模拟消息
TextMessage textMessage = session.createTextMessage("hello activeMQ pub");
//发送消息
producer.send(topic,textMessage);
System.out.println("生产者生产消息完毕~");
//回收资源
session.close();
connection.close();
}
使用发布与订阅模式,必须先启动消费者,确定了有哪些订阅,生产者在向这些消费者发布消息

ActiveMQ的p2p模式与发布订阅模式的更多相关文章
- ActiveMQ入门系列三:发布/订阅模式
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
- C/S模式,发布/订阅模式和PUSH/PULL模式(上)
CS模式(客户端/服务器模式) 最场景的信息传递模式,也称为Request/Response模式,或者调用模式.http/https协议即此模式.因为最常用所以大家一般都比较熟悉,这里不重点讲了,大家 ...
- 第三节: List类型的介绍、生产者消费者模式、发布订阅模式
一. List类型基础 1.介绍 它是一个双向链表,支持左进.左出.右进.右出,所以它即可以充当队列使用,也可以充当栈使用. (1). 队列:先进先出, 可以利用List左进右出,或者右进左出(Lis ...
- 《Javascript设计模式与开发实践》关于设计模式典型代码的整理:单例模式、策略模式、代理模式、迭代器模式、发布-订阅模式、命令模式、组合模式
1.单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 使用闭包封装私有变量// 使用闭包创建单例var user = (function () { var _name = 'sven' ...
- Javascript设计模式之原型模式、发布订阅模式
原型模式 原型模式用于在创建对象时,通过共享某个对象原型的属性和方法,从而达到提高性能.降低内存占用.代码复用的效果. 示例一 function Person(name) { this.name = ...
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...
- Javascript中理解发布--订阅模式
Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...
- [转] Javascript中理解发布--订阅模式
发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...
- JS中什么是发布--订阅模式?
转载文章部分内容: 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. ...
随机推荐
- Android中自定义xml文件给Spinner下拉框赋值并获取下拉选中的值
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...
- 字节码操作、javassist使用
一.功能 1.动态生成新的类 2.动态改变某个类的结构(添加.删除.修改 新的属性.方法) 二.优势 1.比反射开销小,性能高 2.JAVAasist性能高于反射,低于ASM 使用javassis ...
- Blazor client-side + webapi (.net core 3.1) 添加jwt验证流程(非host)第一步
第一步,设置并检查CROS跨域请求 因为我们并不打算将Blazor 由webapi来进行host,所以Blazor和api将是两个域名,这样操作即方便以后单独使用Blazor来写前端,但后端采用已有或 ...
- IIS WEB站点设置
IIS安装 打开控制面板 -> 程序 -> 打开或关闭Windows功能 ,在弹出得对话框中选择“Internet信息服务”复选框.我这里是Windows server 2019 ,界面有 ...
- python——面向对象,继承
"""继承:子类继承父类1.单继承,多继承2. 子类调用或重用父类的同名属性和方法3. 多层4.私有属性和私有方法class 类名(object<父类>)&q ...
- 面试再问ThreadLocal,别说你不会!
ThreadLocal是什么 以前面试的时候问到ThreadLocal总是一脸懵逼,只知道有这个哥们,不了解他是用来做什么的,更不清楚他的原理了.表面上看他是和多线程,线程同步有关的一个工具类,但其 ...
- Java Web 笔记(3)
8.JSP 8.1.什么是JSP Java Server Pages : Java服务器端页面,也和Servlet一样,用于动态Web技术! 最大的特点: 写JSP就像在写HTML 区别: HTML只 ...
- nginx 反向代理及 https 证书配置
nginx 反向代理及 https 证书配置 author: yunqimg(ccxtcxx0) 1. 编译安装nginx 从官网下载 nginx源码, 并编译安装. ./configure --pr ...
- 在IE8的基础上安装IE11
安装包下载 链接:https://pan.baidu.com/s/1WAuyMg_SrfVa0wLjoop5Jw 提取码:nh1r 安装方式 先运行 - EIE11_ZH-CN_WOL_WIN76 ...
- 小白的java学习之路 “ 选择结构(一)”
if选择结构: if选择结构是根据条件判断之后再做处理的一种语法结构. 1.if选择结构的语法: public class Demo{ public static void main(String[] ...