JMS学习的个人理解笔记

摘要:
jms有两种传输模式。我们来看第一种,即点对点传输模式是参与整个过程的系统。总共有三种模式,即发送方系统、jms服务器和接收方系统。原理很简单。基本步骤如下:1.发送方将jms消息发送到jms服务器;2.jms服务器有一个消息队列,它是先进先出的;接收到消息后,jms服务器将消息放入消息队列;3.接收方主动查询jms服务器的消息队列;在上述步骤中,有几个关键点。如果你理解了这些要点,你就会理解原理。

Jms即java消息服务javamessage service,所谓的面向消息编程,主要应用在企业内部各个系统之间做接口,以异步方式传递消息数据。

Jms有2种传送模式,先来看第一种,即点对点传送模式

首先是参与整个过程的系统,总共有3个,分别是发送方系统、jms服务器、接收方系统,原理很简单,基本步骤如下:

1、  发送方将jms消息发送到jms服务器;

2、  Jms服务器有一个消息队列,所谓队列就是先进先出;jms服务器接收到消息后,把消息放到消息队列中;

3、  接收方主动的去jms服务器的消息队列中查询消息;

以上步骤中,有几个关键点,理解了这几个关键点,就理解原理了。关键点如下:

1、  发送方把消息发送到jms服务器后,就不再关心消息什么时候到接收方,也不知道接收方是谁。所以这是一个异步的传输方式,发送方发送完消息后,就可以继续做自己的事情,不等待消息被接收方接收。

2、  接收方是自己主动的去jms服务器上找消息,当接收方把消息从jms服务器读取出来后,会给jms服务器一个回复;这个回复仅给jms服务器,目的是告诉jms服务器消息已经被成功读取,可以把队列中的消息删除掉了。

3、  队列中的消息,每次都是队首的消息被接收方消费掉,且仅仅可以消费一次;一旦被接收方消费,消息即删除。

4、  因为消息仅能被消费一次,所以存在一个问题是消息的校验;比如有2个接收方在读取同一个消息队列,当第1个接收方把消息读取后,发现消息的内容不是自己想要的,应该是发送给第2个接收方的,但是为时已晚,因为消息仅能被消费一次,此条消息在jms服务器队列中已经被删除。

5、  为解决上面的问题,可以利用消息过滤机制;接收方设置了自己的过滤机制后,被过滤的消息对接收方而言是不可见的。

Jms的第二种传送模式是发布/订阅模式,所谓的广播

还是由发送方系统、jms服务器、接收方系统3个系统参与,基本过程如下

1、  发送方在jms服务器上发布一个主题(主题可以理解成一个消息队列,不过在这个模式下叫做主题更贴切)

2、  接收方在jms服务器上订阅这个主题

3、  发送方将消息发送到jms服务器对应的主题上

4、  Jms主动将消息转发给所有订阅主题的接收方

这种模式有一点点的限制,就在于,主题必须先与订阅;相比点对点的方式,队列是虚拟的,发送方不需要先注册队列,接收方也不需要注册队列,异步性解耦更好。

然后看看发布订阅模式的关键点:

1、  发送发把消息发送到jms服务器,同样不关心接收方什么时候接收到消息;但是,发送方此时是可以知道谁会接收到消息的,因为接收方都订阅了嘛,当然就知道了

2、  Jms服务器接收到消息后,是主动的转发给所有的接收方

3、  接收方同样可以设置消息过滤

Jms消息持久化

假设这么一种情况,发送方将1000条数据发送到jms服务器,已经发送成功,但是接收方还没有接收数据,突然,jms服务器down机了,当jms服务器重新启动后发现,消息队列里的数据都没有了,这是难以接受的情况。

Jms之所以适合做企业内系统间数据接口,不仅仅因为异步性,还因为可靠的传输。

Jms消息分持久性消息和临时消息,简单讲,临时消息,就是jms服务器接收到消息后,将消息保存在内存中,这种情况下如果jms服务器down了,消息数据也会丢失。

若设置jms消息的持久化属性,那么jms服务器接收到消息后,会将消息数据保存在持久介质中,例如mysql数据库,这样当jms服务器down机也不会丢失数据。

关于腾讯qq与jms

这2者是没有什么联系的,不过学习jms后总是会想到qq或者突然觉得jms很适合用来做聊天软件,并且大部分的教材中都会用jms写一个简单的chat例子。但是jms真的适合用来做聊天软件吗?

学习了jms的原理后就很好分析这个问题,当然你还需要一点p2p的知识,本文就不对p2p做阐述。

首先,通信软件支持2个人用消息聊天,这很容易想到jms中的点对点消息传送模式,而且设置消息的持久化属性后,即使对方离线,在下一次上线时,也可以接收到离线消息。对于文件传输,jms中也支持二进制消息,可以实现文件传输和离线文件传输。

这一切看上去很美好,但是jms的点对点有致命的2个弱点

1、  不是真正的p2p概念,jms的点对点依然需要jms服务器做转发

2、  接收方需要主动查询消息队列

想想看会出现什么情况,如果你有100个好友,你们通过jms的点对点来通信,那么,即使你的100个好友没有给你发消息,你依然需要定时的到jms服务器上的100个与好友对应的消息队列中检查是否有消息,这样对服务器的压力是巨大的,因为你那100个好友也在不断的向jms服务器发出查询。

若用jms传输文件,会对jms服务器内存造成巨大压力,因为jms服务器会先保存一份,直到接收方消费后才删除。

或许你会想到发布订阅模式,因为这种模式下,jms服务器是主动将数据发送给接收方的。不过,通信软件还需要支持临时群的建立,发送方不需要经过对方同意,只要对方是自己的好友,就可以临时组建对话群,开始群聊。

这与发布订阅模式相违背,因为这种模式下,接收方需要主动订阅主题。

免责声明:文章转载自《JMS学习的个人理解笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java bean 转换工具微信小程序修改radio和checkbox的默认样式和图标下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

一、在 ASP.NET Core 中使用 SignalR

一、介绍 SignalR是一个用于实现实时网站的 Microsoft .NET 库。它使用多种技术来实现服务器与客户端间的双向通信,服务器可以随时将消息推送到连接的客户端。 https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?tabs=visual-studio&view=a...

WebSocket入门及使用指南

最近在一个项目中,需要使用到websocket,于是就花了一点时间来熟悉websocket并总结写篇blog。 为何使用websocket 在浏览器与服务器通信间,传统的 HTTP 请求在某些场景下并不理想,比如实时聊天、实时性的小游戏等等, 其面临主要两个缺点: 无法做到消息的「实时性」; 服务端无法主动推送信息; 其基于 HTTP 的主要解决方案...

Kafka:生产者

Kafka java客户端数据生产流程解析 ProducerRecord ProducerRecord 含义: 发送给Kafka Broker的key/value 值对 //ProducerRecord的成员变量 public class ProducerRecord<K, V> { private final String top...

Diameter 消息格式解析

Diameter消息解释 Diameter消息有一个Diameter header和一系列的AVP组成。 Diameter 基础协议的数据包格式显示如下: Version:必须设置为1,表示 Diameter 版本1。 Command Flags:八位标识。 Command-Code:使用3个八位组段,配合信息传送需求。 Application-ID:4个...

Oracle SQLCODE/SQLERRM

Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。OTHERS处理器应该是异常处理块中的最后的异常处理器,因为它是用来捕获除了别的异常处理器处理以外的所有的Oracle异常,所以在程序的最外层使用一个OTHERS处理器的话,将可以确保所有的错误都会被检测到。在一个内在的异常中,S...

达梦数据库:第一章:MySQL数据库与达梦数据库的区别

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM,它具有如下特点: 1、通用性达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致,使得DM各种组件在不同的硬件平台上具有一致的使用特性。达梦数据库管理系统产品实现了平台无关性...