JMS

JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载 的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。
中文名
JMS
外文名
Java Messaging Service
性    质
API
平台
Java平台

目录

  1. 1 专业技术规范
  2. 2 历史
  3. 3 体系架构
  1. 4 对象模型
  2. 5 模型
  3. 6 传递方式
  1. 7 应用程序
  2. 8 提供者

专业技术规范 编辑

JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。

历史 编辑

Java消息服务是一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914)。2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1,统一了消息域。

体系架构 编辑

JMS由以下元素组成。[1] 
JMS提供者
连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
JMS客户
生产或消费基于消息的Java的应用程序或对象。
JMS生产者
创建并发送消息的JMS客户。
JMS消费者
接收消息的JMS客户。
JMS消息
包括可以在JMS客户之间传递的数据的对象
JMS队列
一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题
一种支持发送消息给多个订阅者的机制。

对象模型 编辑

JMS对象模型包含如下几个要素:[2] 
1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。
4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。
5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。
6)JMS消息通常有两种类型:
① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。
② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。

模型 编辑

Java消息服务应用程序结构支持两种模型:
点对点或队列模型
发布者/订阅者模型
在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:
只有一个消费者将获得消息
生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。
每一个成功处理的消息都由接收者签收
发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:
多个消费者可以获得消息
在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。
使用Java语言,JMS提供了将应用与提供数据的传输层相分离的方式。同一组Java类可以通过JNDI中关于提供者的信息,连接不同的JMS提供者。这一组类首先使用一个连接工厂以连接到队列或主题,然后发送或发布消息。在接收端,客户接收或订阅这些消息。

传递方式 编辑

JMS有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为 PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所 以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要接收所有的消息时才使用。
虽然JMS规范并不需要JMS供应商实现消息的优先级路线,但是它需要递送加快的消息优先于普通级别的消息。JMS 定义了从0到9的优先级路线级别,0是最低的优先级而9则是最高的。更特殊的是0到4是正常优先级的变化幅度,而5到9是加快的优先级的变化幅度。举例来 说: topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub 或 queueSender.send(message,DeliveryMode.PERSISTENT, 8, 10000);//P2P  这个代码片断,有两种消息模型,映射递送方式是持久的,优先级为加快型,生存周期是10000 (以毫秒度量)。如果生存周期设置为零,这则消息将永远不会过期。当消息需要时间限制否则将使其无效时,设置生存周期是有用的。
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
· StreamMessage -- Java原始值的数据流
· MapMessage--一套名称-值对
· TextMessage--一个字符串对象
· ObjectMessage--一个序列化的 Java对象
· BytesMessage--一个未解释字节的数据流

应用程序 编辑

ConnectionFactory 接口(连接工厂)
用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码 不需要进行修改。管理员在JNDI名字空间中配置连接工厂,这样,JMS客户才能够查找到它们。根据消息类型的不同,用户将使用队列连接工厂,或者主题连 接工厂。
Connection 接口(连接)
连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。根据不同的连接类型,连接允许用户创建会话,以发送和接收队列和主题到目标。
Destination 接口(目标)
目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。JMS管理员创建这些对象,然后用户通过JNDI发现它们。和连接工厂一样,管理员可以创建两种类型的目标,点对点模型的队列,以及发布者/订阅者模型的主题。
Session 接口(会话)
表示一个单线程的上下文,用于发送和接收消息。由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的。会话的好处是它支持事务。如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。在提交事务之前,用户可以使用回滚操作取消这些消息。一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。
MessageConsumer 接口(消息消费者)
由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或(非阻塞)接收队列和主题类型的消息。
MessageProducer 接口(消息生产者)
由会话创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。
Message 接口(消息)
是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序。一个消息有三个主要部分:
消息头(必须):包含用于识别和为消息寻找路由的操作设置。
一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
一个消息体(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。
消息接口非常灵活,并提供了许多方式来定制消息的内容。

提供者 编辑

JMS流程图 JMS流程图
要使用Java消息服务,你必须要有一个JMS提供者,管理会话和队列。既有开源的提供者也有专有的提供者。
开源的提供者包括:
Apache ActiveMQ
JBoss 社区所研发的 HornetQ
Joram
Coridan的MantaRay
The OpenJMS Group的OpenJMS
专有的提供者包括:
BEA的BEA WebLogic Server JMS
TIBCO Software的EMS
GigaSpaces Technologies的GigaSpaces
Softwired 2006的iBus
IONA Technologies的IONA JMS
SeeBeyond的IQManager(2005年8月被Sun Microsystems并购)
webMethods的JMS+ -
my-channels的Nirvana
Sonic Software的SonicMQ
SwiftMQ的SwiftMQ
IBM的WebSphere MQ

转载于:https://www.cnblogs.com/downey/p/4890758.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

reStructuredText(.rst)语法规则快速入门

原文:http://blog.useasp.net/archive/2014/09/05/rst-file-restructuredtext-markup-syntax-quikstart.aspx?utm_sourcetuicool 简介 reStructuredText是一种轻量级的文本标记语言,直译为:重构建的文本,是Python中Docutils项目的…

精读linux源码,Linux基础入门的操作精读.doc

摘要:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想&#xf…

安卓App设计博文

安卓1080P界面设计规范解读 http://www.25xt.com/appdesign/9487.html APP设计尺寸解读:px、pt、ppi、dpi、dp、sp之间的关系 http://www.25xt.com/appdesign/9294.html 安卓界面设计规范 http://www.25xt.com/android转载于:https://www.cnblogs.com/tmlee/p/4894…

Android学习四、Android中的Adapter

一、Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set. 一个Adapter是…

linux select shell,linux之shell编程select和case用法

shell里的select用法:语法:#i/bin/bashselect 变量 in 列表do要执行的语句done举例:#!/bin/bashecho "What is your favourite OS?"select var in "windows" "Linux" "Gnu Hurd" "Free BSD&qu…

elasticsearch 查询(match和term)

elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。 由于DSL查询更为直观也更为简易,所以大都使…

Andorid获取状态栏高度

在应用开发中,有时我们需要用代码计算布局的高度,可能需要减去状态栏(status bar)的高度。状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_heig…

linux 域名劫持,域名被劫持处理方案

首先简单说下什么是域名劫持,域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP地址或者什么也不做使得请求失去响应,其效果就是对特定的网址不能访问或…

在linux下修改oracle的sys和system的密码和用户解锁

修改oracle的sys和system的密码和用户解锁 1、再linux系统上sqlplus /as sysdba进入sqlplus后就可以修改sys和system的密码了2、alter user sys identified by "密码"alter user system identified by "密码"其实就是先登录到oracle然后,在里面…

background 与backgroundcolor区别

background 可以设置 背景颜色、背景图片、定位等 background-color 只能设置 背景颜色 转载于:https://www.cnblogs.com/sun9218333949/p/4265863.html

linux 检测蓝牙 rssi,树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)...

若该文为原创文章,转载请注明原文出处长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808下一篇:敬请期待…接下来介绍树莓派蓝牙模块的开发,使用的协议为bluez。客户端bob,服务器al…

Android Studio项目整合PullToRefresh的问题记录

PullToRefresh下拉刷新在App中应用非常频繁,然而PullToRefresh是在ADT下开发完成的。如果要将其整合到Android Studio目录下的话颇费周折。前面的文章“Android Studio项目引入外部库注意事项(PullToRefresh)”介绍了如何将PullToRefresh的library引入到项目中。如果…

POJ 1852 Ants 分析

1、暴搜 每只蚂蚁朝向有两种&#xff0c;可以枚举n只蚂蚁的朝向&#xff0c;然后模拟蚂蚁相遇的情景&#xff0c;总共2^n中情况。 2、分析ants相碰的情况: (a->) (<-b) 变成 (<-a)(b->) 由于每只蚂蚁是相同的&#xff0c;所以等价与(<-b)(a->)&#xff0c;…

第 三 十 八 天:Linux 的 LVM 逻 辑 卷 管 理

小Q&#xff1a;书籍是全世界的营养品。生活里没有书籍&#xff0c;就好像没有阳光&#xff1b;智慧里没有书籍&#xff0c;就好像鸟儿没有翅膀。 —— 莎士比亚简介LVM&#xff1a;Logical Volume Manager&#xff08;逻辑卷管理&#xff09;&#xff…

发福利喽稀疏FFT

附介绍&#xff1a;四位来自麻省理工学院的研究人员蒂娜卡塔比&#xff08;Dina Katabi&#xff09;、海塞姆哈桑&#xff08;Haitham Hassanieh&#xff09;、比欧特因迪克&#xff08;Piotr Indyk&#xff09;和埃里克普里斯&#xff08;Eric Price&#xff09;今年1月&#…

linux 多个秘钥,linux管理多个ssh公钥密钥

很多网上免ssh密码使用git的命令都没有考虑到多个公钥密钥的情况&#xff0c;这里搜集并整理一下管理多个ssh公钥密钥的步骤。首先生成公钥和密钥&#xff0c;默认情况公钥的文件名比密钥末尾多.pubssh-keygen -t rsa -f ~/.ssh/id_rsa.work -C "Key for Work stuff"…

OpenFire源码学习之二十一:openfie对用户的优化(上)

用户类 优化用户主要是要解决用户的连接量。已经对用户的访问速度和吞吐量。 预初始化 在前面的带面中提出来了用户的预初始化。这里就不在贴出来了。下面将redis用户库连接池处理贴出来UserJedisPoolManager public class UserJedisPoolManager extends BasicModule{private s…

Camera Calibration 相机标定:原理简介(三)

3 绝对圆锥曲线 在进一步了解相机标定前&#xff0c;有必要了解绝对圆锥曲线&#xff08;Absolute Conic&#xff09;这一概念。 对于一个3D空间的点x&#xff0c;其投影空间的坐标为&#xff1a;x~[x1,x2,x3,x4]T。我们定义无穷远处的平面用符号Π∞表示&#xff0c;该平面内的…

C语言判断两字符串同构,c语言实现判断两颗树是否同构

在本题中认为如果两个树左右子树交换可以相同&#xff0c;也被认为是同构树。对应输入格式为&#xff1a;4(总结点数)A - 1B 2 3C - -D - -#include #define Tree int#define Null -1#define MAXSIZE 10struct Node{char Element;Tree Left;Tree Right;}T1[MAXSIZE], T2[MAXSIZ…

C语言常量类型及名称,菜鸟带你入门C语言|基本数据类型之常量

常量在程序中&#xff0c;有些数据是不需要改变的&#xff0c;也是不能改变的&#xff0c;因此&#xff0c;我们把这些不能改变的固定值称为常量。如下图中的“5”、“A”、“Good”&#xff0c;这些在程序执行过程中是一直保持不变的&#xff0c;他们就是常量。printf的作用是…