一、Pub/Sub-发布/订阅消息传递模型

在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅topic。topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

发布订阅模型就像订阅报纸。我们可以选择一份或者多份报纸,比如:北京日报、人民日报。这些报纸就相当于发布订阅模型中的topic。如果有很多人订阅了相同的报纸,那我们就在同一个topic中注册,对于报纸发行方,它就和所有的订阅者形成了一对多的关系。如下:

二,Pub/Sub特点

1,每个消息可以有多个消费者。

2,发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个或多个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。

3,为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

三,发布订阅模型的实现

3.1,发布者

/**
*
* @类名称:ActiveMQpubsubProducter
* @类描述:发布者-发布订阅模型
*/
public class ActiveMQpubsubProducter {
//会话对象
private static Session session = null; public static void sendMessages(String name){
try {
session = ActiveMQLinkUtil.initConnection(true, Session.AUTO_ACKNOWLEDGE);
if(session != null){
//创建一个主题
Topic messageTopic = session.createTopic(name);
//创建消息发布者
MessageProducer messageProducer = session.createProducer(messageTopic);
for (int i = 0; i < 5 ; i++) {
TextMessage t = session.createTextMessage("ActiveMQ发布消息:" + i);
messageProducer.send(t);
}
session.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
ActiveMQpubsubProducter.sendMessages("topicDemo");
}
}

3.2,订阅者

----------------------------订阅者1----------------------------

/**
*
* @类名称:ActiveMQpubsubComsumer1
* @类描述:订阅者1-发布订阅模型
*/
public class ActiveMQpubsubComsumer1 {
//会话对象
private static Session session = null; public static void getMessages(String name){
try {
session = ActiveMQLinkUtil.initConnection(false, Session.AUTO_ACKNOWLEDGE);
if(session != null){
Topic topic = session.createTopic(name);
//创建消费者
MessageConsumer messageConsumer = session.createConsumer(topic);
//注册消息监听
messageConsumer.setMessageListener(new MyListener1());
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
ActiveMQpubsubComsumer1.getMessages("topicDemo");
}
}

----------------------------订阅者2----------------------------

/**
*
* @类名称:ActiveMQpubsubComsumer2
* @类描述:订阅者2-发布订阅模型
*/
public class ActiveMQpubsubComsumer2 {
//会话对象
private static Session session = null; public static void getMessages(String name){
try {
session = ActiveMQLinkUtil.initConnection(false, Session.AUTO_ACKNOWLEDGE);
if(session != null){
Topic topic = session.createTopic(name);
//创建消费者
MessageConsumer messageConsumer = session.createConsumer(topic);
//注册消息监听
messageConsumer.setMessageListener(new MyListener2());
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
ActiveMQpubsubComsumer2.getMessages("topicDemo");
}
}

3.3,监听类

----------------------------订阅者1-监听类----------------------------

/**
*
* @类名称:MyListener1
* @类描述:订阅者1-监听类
*/
public class MyListener1 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者一,收到的消息:" + ((TextMessage)message).getText());
//签收
message.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
}

----------------------------订阅者2-监听类----------------------------

/**
*
* @类名称:MyListener2
* @类描述:订阅者2-监听类
*/
public class MyListener2 implements MessageListener {
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者二,收到的消息:" + ((TextMessage)message).getText());
//签收
message.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
}

四,测试

在点对点的要先启动生产者,生产者要生产消息。而发布订阅模型,要先启动订阅者,订阅者先订阅topic,再发布消息。

第一步:运行ActiveMQpubsubComsumer1,ActiveMQpubsubComsumer2

第二步:运行ActiveMQpubsubProducter

五,结果

ActiveMQpubsubComsumer1:

ActiveMQpubsubComsumer2:

ActiveMQpubsubProducter:

ActiveMQ控制台截图:

Number Of Consumers

在该队列上还有多少消费者在等待接受消息。

Messages Dequeued

消费了多少条消息,记做C。

Messages Enqueued

生产了多少条消息,记做P。

发布者发布了5条数据,但是出队的有10条,因为有两个订阅者。

六,总结

发布者向一个特定的消息主题发布消息,0或者多个订阅者可能接收到来自特定消息主题的消息感兴趣。其中发布者和订阅者不知道对方的存在。

3,ActiveMQ-入门(基于JMS发布订阅模型)的更多相关文章

  1. RabbitMQ入门_08_所谓的点对点与发布订阅模型

    A. JMS 模型 JMS 中定义了点对点和发布订阅两种消息模型,原来以为 AMQP 协议中 direct Exchange 对应点对点模型,topic Exchange 对应发布订阅模型,fanou ...

  2. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  3. windows安装ActiveMQ以及点对点以及发布订阅

    一.MQ产品的分类 1.RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级 ...

  4. 基于spring-redis发布订阅模式的实现

    redis配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...

  5. ActiveMQ基于JMS的pub/sub传播机制

    原文地址:[ActiveMQ实战]基于JMS的pub/sub传播机制 发布订阅模型 就像订阅报纸,我们可以选择一份或者多份报纸.比如:北京日报.人民日报.这些报纸就相当于发布订阅模型中的topic.如 ...

  6. 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

    一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...

  7. 基于.NET Socket Tcp的发布-订阅框架

    基于.NET Socket Tcp的发布-订阅框架 一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已 ...

  8. NATS—发布/订阅机制

    概念 发布/订阅(Publish/subscribe 或pub/sub)是一种消息范式,消息的发送者(发布者)不是计划发送其消息给特定的接收者(订阅者).而是发布的消息分为不同的类别,而不需要知道什么 ...

  9. ActiveMQ入门系列一:认识并安装ActiveMQ(Windows下)

    一.什么是ActiveMQ 度娘给出的定义: Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件:由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Jav ...

随机推荐

  1. bigdata数据分析(二):关闭防火墙&安装telnet

    先检查CentOS7.0是否已经安装以下两个安装包:telnet-server.xinetd.命令如下: rpm -qa telnet-server rpm -qa xinetd 如果没有安装,则先安 ...

  2. 【ABAP系列】SAP ABAP 控制ALV单元格编辑后获取新的数值

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 控制ALV单元 ...

  3. 关于cors 跨域的一些问题

    system.webServer节点写配置 <httpProtocol> <customHeaders> <add name="Access-Control-A ...

  4. Canvas入门08-绘制仪表盘

    需求 实现下图所示的仪表盘的绘制. 分析 我们先来将仪表盘进行图形拆分,并定义尺寸. 我们绘制的逻辑: 绘制中心圆 绘制环外圈圆 绘制环内圈圆 绘制刻度内圈圆 绘制刻度线 绘制刻度文字 绘制指针 定义 ...

  5. 指定pom文件jdk版本

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  6. Spark-Core RDD行动算子

    1.reduce(func) 通过func函数聚集RDD 中的所有元素,先聚合分区内数据,再聚合分区间数据. scala> val rdd1 = sc.parallelize(1 to 100) ...

  7. vue vuex应用

    vue结构图: vuex为vue的一个插件,用来管理共享数据的,局部数据声明在自己组件内部. 没有使用vuex时,所有共享数据和操作数据的方法都声明在父组件内,数据的通信用props及pubsub等. ...

  8. 51nod1769 Clarke and math 2

    题目 实际上就是要求\(f*I^k\). 因为\(I^k\)是一个积性函数,所以我们只需要考虑如何求\(I^k(p^a)\). 把这个东西转化成一个长度为\(k\)的序列,每一位是\(\frac{i_ ...

  9. 【SSL1786】麻将游戏

    题目大意: 给出一个矩阵,查询其中两个点连通线段数 正文: 看这题好眼熟... 实质和这道题是一模一样的,只不过由一条询问升级到多条询问.

  10. html中设置height=100%无效的问题

    设置height=100%(网页内容能够更好的适配各种屏幕大小) 第一种是设置某个单独的div元素   height=100%无效 原因很简单,所有基于本分比的尺寸必须基于父元素,而你如果没有设置父元 ...