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学习的个人理解笔记的更多相关文章
- 深度学习-InfoGAN论文理解笔记
在弄清楚InfoGAN之前,可以先理解一下变分推断目的以及在概率论中的应用与ELBO是什么,以及KL散度 https://blog.csdn.net/qy20115549/article/detail ...
- 笨办法学习python-ex51自我理解笔记
本章节主要讲的是web的工作原理,先大概熟悉记录一下,为以后写Django web框架打下基础. web工作原理: 1.用户从浏览器输入网址----->browser通过电脑中的网络设备(网卡) ...
- 学习Logistic Regression的笔记与理解(转)
学习Logistic Regression的笔记与理解 1.首先从结果往前来看下how logistic regression make predictions. 设我们某个测试数据为X(x0,x1, ...
- batch normalization学习理解笔记
batch normalization学习理解笔记 最近在Andrew Ng课程中学到了Batch Normalization相关内容,通过查阅资料和原始paper,基本上弄懂了一些算法的细节部分,现 ...
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习
转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...
- 学习《深入理解C#》—— 数据类型、排序和过滤 (第一章1.1---1.2)
引言 在开始看这本书之前看过一些技术博客,填补自己对于一些知识点的不足.无意中发现了<深入理解C#>这本书,本书主要探讨C# 2.C# 3和C# 4的细节与特性,所以做了一下阅读笔记,欢迎 ...
- 转载-《Python学习手册》读书笔记
转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...
随机推荐
- HTML 5 Web Storage 使用
在html中,可以使用 Web Storage API 来保存数据在浏览器客户端,这样可以避免重复从服务器加载数据. 有两种API, sessionStorage 和 localStorage ,它们 ...
- vc++窗口的创建过程(MFC消息机制的经典文章)
一.什么是窗口类 在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...
- Java之GUI编程(一)
GUI全称Graphical User Interfaces,意为图形用户户界面,又称为图形用户接口.GUI指的就是採用图形方式显示的计算机操作用户界面,打个例如吧.我们点击QQ图标,就会弹出一个QQ ...
- 第一次PS练习
嘿嘿,自己第一次的PS,虽然把在大神眼里是小KS,但是了,对我来说值得劲纪念.加油,我会努力的.
- SQLyog 注册码
用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417a56ea5da-f30b-4fb1-8a05-95f346a9b20ba0fe8645-3916- ...
- 【ant项目构建学习点滴】--(3)打包及运行jar文件
<?xml version="1.0" encoding="UTF-8"?> <project default="compile&q ...
- [转]CentOS_yum的详细使用方法
yum 是什么yum = Yellow dog Updater, Modified主要功能是更方便的添加/删除/更新RPM包.它能自动解决包的倚赖性问题.它能便于管理大量系统的更新问题 yum特点可以 ...
- 从 Qt 的 delete 说开来
原地址:http://blog.csdn.net/dbzhang800/article/details/6300025 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 ...
- SQL之概念
SQL即结构化查询语言,是一个功能强大的数据库语言,可以分为: 1.DML即数据操作语言,用于检索或者修改数据: 2.DDL即数据定义语言,用于定义数据的结构,如创建.修改.删除等: 3.DCL即数据 ...
- C语言数据结构----栈的定义及实现
本节主要说的是数据结构中的栈的基本定义和实现的方式,其中实现的方式采用的是复用顺序表和单向链表的方式. 一.栈的基本定义 1.栈是一种特殊的线性表,只能从固定的方向进出,而且栈进出的基本原则是:先进栈 ...