JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

JMS基本构件包括:

受管理对象:连接工厂和目的地

连接

会话

JMSContext对象:它将一个连接和一个对话结合在一个对象中

消息生产者

消息消费者

消息

将这些对象集成在一个JMS对象中:

JMS应用架构由以下几个部分构成:

JMS提供者:是一个实现JMS接口的消息传送系统。提供管理和控制特性。支持全部特性的JAVA EE平台就包括一个JMS提供者。

JMS客户端:是用java语言编写的程序或组件。可以生成(生产)或使用(消费消息)。所有JAVA EE应用组件都可以作为一个JMS客户端。

消息          :是在JMS客户端之间传递信息的对象。

受管理对象:是为客户端配置的JMS对象。有两类JMS受管理对象:目的地和连接工厂。管理员可以创建公共可用的对象。

消息传送方式:

因为在JMS API出来之前,大多数消息传送产品都支持点对点或发布/订阅传送方式。JMS规范为这两种方式都定义了兼容模式。JMS提供者必须实现这两种方式,JMS API还分别提供了这两种方式特定的接口。

点对点消息传送方式:

点对点产品或应用是建立在消息队列、发送者和接受者的概念基础上。建立队列来维护消息,每个消息都发送到特定对列上,接收客户端从这些队列中抽取信息。队列会保留发送给他们的所有消息,知道消息被使用或到期。

点对点消息消息传送的特点:

每个消息都只有一个消费者(即使用方)。

接收者可以获取信息,而不论客户端发送消息时接收者是否正在运行。

点对点消息传送模型:

如果每一个消息都必须由一个消费者成功地处理,就可以使用点对点消息传送。

发送/订阅消息传送方式

在一个发送/订阅产品或应用中,客户端将消息发送到一个主题,它的功能类似于公告板。发布者和订阅者可以动态地向主题发布或订阅。会有多个发布者向主题发送消息,系统将到达主题的消息发布给主题的多个订阅者。主题只是在向订阅者发布消息时才保留消息。

采用发布/订阅消息发布方式时,要区分订阅主题的消费者(订阅者)和所创建消息的订阅,消费者是应用中的一个JMS对象,而订阅是JMS提供者中的一个实体。一般地,一个主题可以有多个消费者,但是一个订阅只有一个订阅者。不过,有可能创建共享地订阅。

发布/订阅消息传送有以下特点:

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

对于订阅一个主题的客户端,只有这个客户端创建一个订阅之后才能使用所发送的消息,消费者必须保持活跃状态才能使用消息。

JMS API允许应用创建持久订阅,利用持久订阅,消费者不活动时也可以接收发送的消息。持久订阅提供了队列的灵活性和可靠性。而且允许客户端向多个接收方发送消息。

如果每个消息可以由任意多个消费者(或者没有任何消费者)处理,就可以使用发布/订阅消息传送方式

发布/订阅消息传送模型:

JMS应用中的两个部分(目的地和连接工厂)通常采用管理方式而不是编程方式来维护。对于JMS的不同实现,这些对象的底层技术可能有很大差别。因此这些对象的管理也会随提供者的不同而不同。

JMS连接工厂:

连接工厂是客户端用来创建连接的对象,客户端可以用它来创建与一个提供者的连接。连接工厂封装了由管理员定义的一组连接配置参数。每个连接工厂是ConnectionFactory、QueueConnectionFactory或TopicConnectionFactory接口的一个实例。

在JMS客户端程序最前面,通常要将一个连接资源注入到一个ConnectionFactory对象。Java EE服务器必须提供一个逻辑JNDI名为 java:comp/DefaultJMSConnectionFactory的JMS连接工厂,实际的JNDI名由具体实现确定。

JMS目的地:

客户端用目的地对象指定所生成消息的目标以及所使用消息的来源。在PTP消息传送方式中 目的地成为队列 。在发布/订阅消息传送方式中,目的地成为主题。JMS队列可以使用对个对象或主题(或者两者都使用)

要使用GlassFish服务器创建一个目的地,可以创建一个JMS目的地资源并为目的地指定一个JNDI名。

在JMS的GlassFish服务器实现中,每个目的地资源指示一个物理服务器,可以显示地创建一个物理目的地,不过如果没有创建物理,应用服务器便会在需要时创建,并在删除目的地资源时将其删除。

除了将连接工厂资源注入到客户端程序外,通常还需要注入一个目的地资源。与连接工厂不同,目的地特定于点对点或发布/订阅消息传送方式。要创建一个允许对主题和队列使用相同代码的应用,需要将目的地赋值给一个Distination对象。

连接:

连接是封装了一个与JMS提供者的虚拟连接。例如,连接可以表示客户端与服务者后台之间的一个打开的TCP/IP socket。在Java EE平台中,只有应用客户端能够为一个连接创建多个会话。在web 和企业bean组件中,一个连接最多只能创建一个会话。通常通过创建JMSContext对象来创建连接。

会话:

会话是生成和使用消息的一个单线程上下文。

通常会通过创建一个JMS对象来创建会话(以及连接)。可以使用会话来创建消息生产者,消息消费者,消息,队列浏览器和临时目的地。

会话将串行化消息监听器地执行。

会话提供了一个事务上下文,利用它将一组接收和发送操作分组到一个原子工作单元。

摘自《Java EE 7权威指南 卷2》

java消息服务学习之JMS概念的更多相关文章

  1. java消息服务学习之JMS高级特性

    将介绍的内容是: 控制消息确认.为发送消息指定选项.创建临时目的地.使用JMS本地事务.异步发送消息 五个方面. 1.控制消息确认 在JMS消息得到确认之前,并不认为它已经成功使用.要成功使用消息,通 ...

  2. MQ消息队列(2)—— Java消息服务接口(JMS)

    一.理解JMS   1.什么是JMS?         JMS即Java消息服务(Java Message Service)应用程序接口,API是一个消息服务的标准或者说是规范,允许应用程序组件基于J ...

  3. Java消息服务

    什么是消息? 消息是可编程实现两端通信的机制.通常的一些消息技术如:TCP/IP Sockets.管道.文件.共享存储. Java消息服务 Java消息服务,即Java Message Service ...

  4. ActiveMQ学习总结(5)——Java消息服务JMS详解

    JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...

  5. JMS(Java消息服务)入门教程

    什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...

  6. 【转载】JAVA消息服务JMS规范及原理详解

    转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...

  7. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  8. Java消息队列ActiveMQ (一)--JMS基本概念

    摘要:The Java Message Service (JMS) API is a messaging standard that allows application components bas ...

  9. Java消息服务初步学习(基于Spring In Action的整理)

    几个名词 Java消息服务(Java Message Service)是一个Java标准,定义了使用消息代理的通用API. 消息代理(message broker):类似于邮局的作用,确保消息被投递到 ...

随机推荐

  1. 使用Dubbo的SPI扩展机制实现自定义LoadBalance——方法二 不改源码添加META-INF/dubbo元数据

    一.官网提供的方法 参考官网 http://dubbo.apache.org/zh-cn/docs/dev/impls/load-balance.html 二.方法总结 在工程中创建类并实现LoadB ...

  2. IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目

    IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目 1.确认 IDEA 是否启用了 tomcat 插件 2.添加 tomcat 选择 tomcat 存放路 ...

  3. Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    运行代码时,一直报错: 经过查询后才知道,vue模板只能有一个跟对象 我是这样写的 最后修改为 就可以正常运行了

  4. php抓取图片进行内容提取解析,文字性pdf进行内容文字提取解析

    2018年7月7日18:52:17 php是用纯算法,自己是提取图片内容不是不行,可以但是优化起来很麻烦还得设计学习库,去矫正数据的正确率 对于大多数项目来说,如果不是做ocr服务,就不必要做需求工具 ...

  5. 1python简介

    02 python和03 python的区别: python:优美,清晰,简单. python2x:    源码重复,混乱,冗余.    源码不规范.     python3x: 源码整合,优美,清晰 ...

  6. JS数组reduce()方法详解及高级技巧

    1.语法 arr.reduce(callback,[initialValue]) reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上 ...

  7. openLayers,常见地图实例

    http://openlayers.org/en/master/examples/epsg-4326.html -- 标尺 http://openlayers.org/en/master/exampl ...

  8. java手写线程池,完善中

    package com.test001.threadpool; import java.util.LinkedList; import java.util.List; import java.util ...

  9. MySQL 误删数据、误更新数据(update,delete忘加where条件)

    MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 转自:https://www.cnblogs.com/gomysql/p ...

  10. weblogic的基础安装

    安装java环境 不能使用centos自带的openjdk  必须使用源码安装 把下载的jdk-8u181-linux-x64.tar 解压到 /usr/src目录下      tar zxvf jd ...