JMS概述

消息服务是指,两个或者多个客户机能够通过发送和接受消息(以对等的方式)通信。消息是通过消息服务器有一个客户机发送到另一个客户机的"一块"数据,可以是文本的,也可是数值的,如果客户机是Java应用程序,数据还可以包括对象。其中客户机不需要同时运行。

 使用消息服务的原因:

1.松散耦合但是高内聚。使用消息服务的客户机不需要实现通用接口,不需要了解对方。消息服务提供了标准接口。

2.不直接通信。客户机不直接对话,而通过中间媒介,消息服务扮演 缓冲区,并提供 安全控制。

3.保证消息传递。 JMS的提供者保持消息持久,直到客户机接受为止。

4.异步通信。

5.一对多、多对多和多对一通信。

JMS(Java 消息服务)是一组标准的API,能够用于访问多种消息服务器。使用JMS,可以使用一样的API访问IBM的MQSeries、JBossMQ等消息服务。

JMS API中有很多核心概念是映射到底层的消息服务器。其中:

1.受控对象(Administered Object)。它们是由管理者创建的供JMS客户机使用的对象。如 连接工厂(Connection Factory),它们用于与底层的消息服务器和目标(队列和主题)进行连接(注:不太理解,可能错了。)。管理通过JNDI对他们进行管理。JMS提供了JMS客户机和实际JMS提供者之间的缓冲区。JBoss就是这些对象的管理者。

2.JMS提供者。实现了JMS接口的消息服务器。(如 JBossMQ消息服务器)。

3.JMS客户机。消息的生产者和消费者。由于是对等的通信机制,所以没有客户机和服务器的概念。JMS既可以是消息创建者又是消息接收者。

4.消息(Message)。JMS客户机之间传送的一条条消息。

传统的消息服务一般支持点对点通信和发布/订阅通信两种通信模式的一种。JMS API 两种都支持。

 Point-To-Point(点对点)

点对点通信模式,有一个中心队列作为发布的目标(受控对象)。一个或多个消息生产者可以发送消息到这个队列。然后被消息的消费者选取。

  1. P2P模式图 
  2. 涉及到的概念 
    1. 消息队列(Queue)
    2. 发送者(Sender)
    3. 接收者(Receiver)
    4. 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
  3. P2P的特点

    1. 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
    2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
    3. 接收者在成功接收消息之后需向队列应答成功

    如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。

     Pub/Sub(发布/订阅)

发布/订阅通信模式是基于主题(Topic)概念的。主题是消息的发布目标(受控对象)。它和队列的不同就在于,可以有多个发送消息和接收消息的客户机,每个主题可以有多个发布者和多个订阅者。

  1. Pub/Sub模式图 
  2. 涉及到的概念 
    1. 主题(Topic)
    2. 发布者(Publisher)
    3. 订阅者(Subscriber) 
      客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
  3. Pub/Sub的特点

    1. 每个消息可以有多个消费者
    2. 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
    3. 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

    如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

JMS API

JMS API是在javax.jms包中定义的。要使用JMS API 需要创建一个提供连接对象的连接工厂。连接对象提供与消息服务器的链接。链接被用来创建会话,会话被用来创建消息,消息通过消息的生产者发送到目标(队列或主题),然后消息传递到消息消费者。

JMS Parent

PTP Domain

Pub/Sub Domain

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver/QueueBrowser

TopicSubscriber

说明:QueueReceiver从队列中获取消息后,该消息从队列中删除

QueueBrowser 只是浏览队列中的信息。QueueBrowser它是独立的接口

以下是对这些接口的简单描述:

1.连接工厂(Connection Factory)

是客户机用来创建与JMD提供者的链接的对象。它是受控对象,可以通过JNDI查找。JMS API定义了两种类型的连接工厂。 QueueConnectionFactory 和 TopicConnectionFactory

2.连接(Connection)

连接对象是和JMS提供者通信的媒介。这个通信的具体实现依赖于JMS提供者。除了通用的借口,还有基于队列(QueueConnection)和基于主题(TopicConnection)专用接口。

3.会话(Session)

用于创建消息的生产者、消费者和消息。它们都是单线程,能参加事务。有QueueSession和TopicSession。

4.消息(Message)

消息是消息服务器在客户端之间发送的一条条信息。有五种接口,不同的类型消息。1. StreamMessage -- Java原始值的数据流  2. MapMessage--一组名/值对  3.TextMessage--一个字符串对象 4. ObjectMessage--一个序列化的 Java对象 5.BytesMessage--一个未解释字节的数据流。

消息由以下几部分组成:

消息头(header):JMS消息头包含了许多字段,是一组标准键值字段,客户端和提供者动用它来标识和路由消息。它们是消息发送后由JMS提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。Message接口Wie获取和设置Header字段提供了相关方法,如getJMSPriotity(),setJMSMessageID()等

属性(property):由消息发送者产生,用来添加删除消息头以外的附加信息。如果用户觉得JMS标准Header中的属性不够用,那么可以设置其他属性。Message提供了Setter和getter方法来设置和获取各种java类型属性,如getStringProperty("username")等。虽然开发者可以自定义任意的属性名,但是JMS也规定了JMS提供者可以有选择实现一组标准属性。在定义属性名时有一个规则:以JMS为前缀的属性是JMS专用,以JMSX_为前缀的属性是JMS提供者专用。

消息体(body):由消息发送者产生。消息正文包含了发送给其它程序的消息内容,根据消息体类型的不同,JMS拥有5个消息类型,并分别通过Message的5个子类接口来描述.

消息的确认:消息确认是接受或者在成功接收(针对接收消息而言)消息后,将一个MOM的回执,告知已经成功接收的一种通知机制,消息确认类型在通过Connection创建Seesion时,作为createSession()的方法参数。如果使用了事务的方式,则该确认方式会被忽略.

消息选择器:消息选择器是一个包含选择表达式的字符串语句,该表达式的语法是基于SQL92的子集,对应WHERE部分的过滤表达式。在尝试接收消息时,消息选择器对目标进行过滤,只有匹配选择器过滤条件的消息才会被接收.

消息选择器的使用:

1.选择条件通过Header子段和Properties属性进行匹配度设置,Body内的值不能用于选择条件。另外,Header中的字段只能限定在以下子段中:JMSDeliveryMode,JMSPriotiry,JMSMessageID,JMSTimestamp,JMSCorrelationID,JMSType.

2.消息选择器在通过Session创建接收者(或者QueueBrowser)时指定,格式如下

  
MessageConsumer consumer = session.createConsumer(dest,"JMSType='person'");

消息的发送:

  
publicvoid send(String msg)throwsException{
InitialContext ctx =newInitialContext();
ConnectionFactory factory =(ConnectionFactory)ctx.lookup("jndi/jmsConn");
Destination dest =(Destination)ctx.lookup("jndi/dest");
ctx.close();
Connection conn = factory.createConnection();
Session session = conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
MessageProducer sender = session.createProducer(dest);
TextMessage message = sesssion.createTextMessage(msg);
sender.send(message);
session.close();
conn.close();
}

JMS规范要求ConnectionFactory和Destination必须从JNDI中获取,因此在一般情况下,JMS客户端程序必须绑定在应用服务器上。
消息的接收:
  
publicvoid receive()throwsException{
InitialContext ctx =newInitialContext();
ConnectionFactory factory =(ConnectionFactory)ctx.lookup("jndi/jmsConn");
Destination dest =(Destination)ctx.lookup("jndi/dest");
ctx.close();
Connection conn = factory.createConnection();
Session session = conn.createSession(false,session.AUTO_ACKNOWLEDGE);
MessageConsumer receiver = session.createConsumer(dest);
conn.start();
TextMessage message =(TextMessage)receiver.reciver();
System.out.println(message.getText());
session.close();
conn.close();
}

5.目标(Destination)

目标是受控对象。在JMS中表示一个队列或者一个主题。

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination

6.消息生产者(MessageProducer)

是用于将消息发送到目标的对象,由会话对象创建,有QueueSender、TopicPublisher.

消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

7.消息消费者(MessageConsumer)

是由会话对象创建,用于从目标获取消息,有QueueReceiver、TopicSubscriber

消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者

8. MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。

JMS事务处理

一个JMS应用是几个JMS 客户端交换消息,开发JMS客户端应用由以下几步构成:

1) 用JNDI 得到ConnectionFactory对象;

2) 用ConnectionFactory创建Connection 对象;

3) 用Connection对象创建一个或多个JMS Session;

4) 用JNDI 得到目标队列或主题对象,即Destination对象;

5) 用Session 和Destination 创建MessageProducer和MessageConsumer;

6) 通知Connection 开始传递消息。

JAVA JMS 简介相关推荐

  1. 消息中间件原理及JMS简介(2)

    本文首先介绍了消息中间件的原理,然后介绍了目前流行的消息中间件产品和一些开源实现.最后详细分析了SUN及其伙伴公司提出的旨在统一各种消息中间件系统接口的规范(JMS).   2.3 消息中间件的传递模 ...

  2. Java EE 简介

    Java EE 简介 Java EE 基本架构 JavaEE 的诞生是为了解决传统 C/S 架构的弊端:客户端臃肿庞大,扩展性差等弊端. JavaEE 将传统的两层结构细分为了四层. 这四层分别是:C ...

  3. java程序包不存在_第一章 Java语言简介

    Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...

  4. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  5. ibm java_IBM i 上Java 虚拟机简介

    Abstract IBM i 上Java 虚拟机简介 Body Java在IT业界有多流行?google上搜索一下java, 结果一目了然(今天早上我搜索到的记录数是840000000条).Java之 ...

  6. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括: Java异常简介 Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.htm ...

  7. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  8. OpenCV Java开发简介

    OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...

  9. JDK14中的java tools简介

    文章目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jde ...

最新文章

  1. 修改hostname
  2. flask前端显示MySQL数据_flask怎样查询mysql并显示在页面上
  3. PL/SQL Developer 中文乱码解决
  4. 前端学习(1467):过滤器
  5. java改变实参_java中引用传递问题,在函数中修改引用的指向,会不会影响实参?...
  6. qt opengl 2d绘图效率_Qt趣味开发之打造一个3D名字渲染小工具
  7. 要走路~先要有一雙最舒適的鞋
  8. Linux configure 参数解释
  9. 李洪强iOS经典面试题30-一个区分度很大的面试题
  10. python 文件夹_使用python进行文件夹对比
  11. python测网速_python一键测试网速
  12. adb 判断imei_获取设备序列号 SN码(对应:设置-关于手机-状态-序列号 )
  13. Oracle数据库:约束行限制where语句,判断条件,比较条件,字符串日期格式,in,like,escape,null语句
  14. 四, Scala 伴生对象, 特质
  15. 2014年中南大学上机复试
  16. linphone 智能带宽分配
  17. html5渐变的两种方式,HTML5的渐变色 渐变的两种类型 createLinearGradient 和createRadialGradient...
  18. 华为自研发操作系统鸿蒙,你知华为芯片“麒麟”之意,又可知自研系统“鸿蒙”之深意?...
  19. Github从账号创建到上传项目
  20. 推荐一个不错的写作软件

热门文章

  1. Delphi Assigned 简单使用
  2. tomcat HTTP与HTTPS同时开启并且同时可以访问
  3. 好用的在线画图工具processon
  4. 伪静态URLRewrite学习笔记
  5. PostgreSQL 12 中文文档
  6. windows.edb文件
  7. Kd树实现knn算法(python)
  8. java excel 设置行高 jxi_win7系统下excel2007批量设置行高、列宽、行列间距的方法...
  9. 双目立体匹配算法SGBM
  10. 云主机安全防护服务有哪些