JMS的规范,以及ActiveMQ中p2p和publish/subscriber2中模式
来源:互联网 发布:win10升级软件 编辑:程序博客网 时间:2024/05/21 15:13
JMS规范文档地址如下:
http://udn.yyuap.com/doc/JMS2CN/01_introduction/index.html
JMS是什么?
Java JMS是SUB提出的旨在统一各种MOM系统接口的规范,它包含点对点(Ponit to Point,PTP)和发布/订阅(Publish/Subscribe, pub/sub)2种消息模型,提供可靠的消息传输、事务和消息过滤等机制。
主要特点2个:
1.消息异步接受,消息发送者不需要等待消息接受者的响应。
2.消息可靠接受,缺陷消息在中间件可保存,只有接收方收到后才删除消息,多个消息也可以组成原子事物。
MOM指的是什么?
面向消息的中间件:Message-oriented Middleware,MOM基本功能是:将消息以消息的形式,从一个应用程序传递到另一个或多个应用程序。
ActiveMQ是什么呢?
activeMQ是apache组织下的一个开源软件,它遵循JMS1.1规范(Java Message Service),是消息驱动中间件软件(MOM)。它为企业消息传递提供高可用,出色性能,可扩展,稳定和安全保障。ActiveMQ使用Apache许可协议。因此,任何人都可以使用和修改它而不必反馈任何改变。这对于商业上将ActiveMQ用在重要用途的人尤为关键。MOM的工作是在分布式的各应用之间调度事件和消息,使之到达指定的接收者。所以高可用,高性能,高可扩展性尤为关键。
以上只是铺垫,看看JMS中的点对点和发布与订阅这2中模式究竟是什么?
1.点对点模式
一条消息仅能被一个consumer收到。如果在message发送的时候没有可用的consumer,那么它将被保存一直到能处理该message的consumer可用。如果一个consumer收到一条message后却不响应它,那么这条消息将被转到另一个consumer那儿。一个Queue可以有很多consumer,并且在多个可用的consumer中负载均衡。
它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路,它的通信场景如下图所示:
测试代码如下:
发送端:
public class Sender {private static String userName = ActiveMQConnection.DEFAULT_USER;private static String pwd = ActiveMQConnection.DEFAULT_PASSWORD;private static String brokerUrl = "tcp://192.168.204.149:61616";private static String subject = "queuesTest";public static void main(String[] args) throws JMSException, InterruptedException {ConnectionFactory factory = new ActiveMQConnectionFactory(userName,pwd, brokerUrl);Connection connection = factory.createConnection();connection.start();Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Destination destination = session.createQueue(subject);MessageProducer producer = session.createProducer(destination);//创建1条消息MapMessage message = session.createMapMessage();message.setString("msg", "我发送的消息...");producer.send(message);Thread.sleep(1000);session.commit();session.close();connection.close();System.out.println("sent...OK");}}
接收端:
public class Received { private static String userName = ActiveMQConnection.DEFAULT_USER; private static String pwd = ActiveMQConnection.DEFAULT_PASSWORD; private static String brokerUrl = "tcp://192.168.204.149:61616"; private static String subject = "queuesTest"; public static void main(String[] args) throws JMSException { ConnectionFactory factory = new ActiveMQConnectionFactory(userName,pwd, brokerUrl); final Connection connection = factory.createConnection(); connection.start(); final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue(subject); MessageConsumer consumer = session.createConsumer(destination); //receive message consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { MapMessage mapMessage = (MapMessage) message; try { String msg = mapMessage.getString("msg"); System.out.println("received msg:" + msg); session.commit(); Thread.sleep(3000); session.close(); connection.close(); } catch (JMSException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }); }}
2.发布/订阅者模式:
一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个subscriber将接收到消息的一个拷贝。
发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸,那么对于我们每一个订阅者来说,我们可以选择一份或者多份报纸。比如北京日报、潇湘晨报等。那么这些个我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。那么,在这里,相当于我们在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。这种关系如下图所示:
发布者:
public class Publish {private static String userName = ActiveMQConnection.DEFAULT_USER;private static String pwd = ActiveMQConnection.DEFAULT_PASSWORD;private static String brokerUrl = "tcp://192.168.204.149:61616";private static String subject = "topic";public static void main(String[] args) throws JMSException, InterruptedException {ConnectionFactory factory = new ActiveMQConnectionFactory(userName,pwd, brokerUrl);Connection connection = factory.createConnection();connection.start();Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Topic topic = session.createTopic(subject);MessageProducer producer = session.createProducer(topic);producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//创建1条消息MapMessage message = session.createMapMessage();message.setString("msg", "我发送的消息...");producer.send(message);Thread.sleep(1000);session.commit();session.close();connection.close();System.out.println("publish...OK");}}
订阅者1:
public class Subscriber {private static String userName = ActiveMQConnection.DEFAULT_USER;private static String pwd = ActiveMQConnection.DEFAULT_PASSWORD;private static String brokerUrl = "tcp://192.168.204.149:61616";private static String subject = "topic";public static void main(String[] args) throws JMSException, InterruptedException {ConnectionFactory factory = new ActiveMQConnectionFactory(userName,pwd, brokerUrl);Connection connection = factory.createConnection();connection.start();Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);Topic topic = session.createTopic(subject);MessageConsumer consumer = session.createConsumer(topic);consumer.setMessageListener(new MessageListener() {@Overridepublic void onMessage(Message message) {MapMessage mapMessage = (MapMessage) message;try {String msg = mapMessage.getString("msg");System.out.println("收到消息:" + msg);session.commit();Thread.sleep(30000);session.close();connection.close();} catch (JMSException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}}
总结:p2p模式的消息会发送给当前线上或者线下(上线后)都能接受,且发送的消息只能发送给一个消费者,消费者接受后会消息会自动删除。ps模式的消息会发送给当前在线上的订阅者。因为好比你在看电视,好比听广播,如果我们要完整的听一个节目,肯定是在节目开始之前把收音机打开,如果我们在节目开始之后再打开收音机,肯定听不完全。在运行玩发布者之后,如果上趟厕所,回来再运行订阅者,你会发现一条消息都收不到。
- JMS的规范,以及ActiveMQ中p2p和publish/subscriber2中模式
- jms 的两种模式,p2p ,publish/substrib
- 理解JMS规范中消息的传输模式和消息持久化
- 理解JMS规范中消息的传输模式和消息持久化
- 理解JMS规范中消息的传输模式和消息持久化
- 理解JMS规范中消息的传输模式和消息持久化
- JMS的两种消息模型(Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub))应用举例
- JMS的两种消息模型(Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub))应用举例
- 主题:JMS的两种消息模型(Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub))应用举例
- JMS的两种消息模型(Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub))应用举例
- ActiveMQ 02 JMS规范
- ActiveMQ和JMS的使用
- MQ、JMS以及ActiveMQ 关系的理解
- MQ、JMS以及ActiveMQ 关系的理解
- MQ、JMS以及ActiveMQ 关系的理解
- MQ、JMS以及ActiveMQ 关系的理解
- MQ、JMS以及ActiveMQ 关系的理解
- MQ、JMS以及ActiveMQ 关系的理解
- 【QT】:QT实现关联和解决关联
- 2010 Asia Fuzhou Regional Contest 之 A hard Aoshu Problem
- 第四章: 数组
- cvThreshold函数使用与注意事项
- Android 智能指针(1)
- JMS的规范,以及ActiveMQ中p2p和publish/subscriber2中模式
- 在UWP中使用RichEditBox只读时图片显示问题(最后有关于RichEditBox颜色问题的解决方案)
- Spring事务配置的五种方式
- 4456: [Zjoi2016]旅行者 分治+最短路
- oc中block的理解
- 方法:Mac终端控制文件显隐性
- H264--1--编码原理以及I帧B帧P帧、pts&dts
- linux 个性化
- 第五章:函数