浅谈JMS--(JMS 的简介)

在公司快两年了,也跟着团队做了几个项目;期间写过很多个接口,有使用webServices的,也有JMS的。之前的文章说过了webService的接口,这次想简单谈谈JMS,由于本身就属于中的菜鸟,有不好的地方;请手下留情勿拍砖!

1.jms的定义

jms 即(java message service)java 消息服务,是一组 Java 应用程序接口,用以提供创建、发送、接收、读取消息的服务。SUN 只提供接口,由不同的厂商根据该接口提供自己的实现。

2.JMS 的目标

更好地理解 JMS 有助于了解 JMS 规范的制定者设置的目标。现在,市场上有许多企业消息产品,生产这些产品的几家公司也参与了 JMS 的开发。

现有的这些系统的能力和功能各不相同。这些制定者知道如果 JMS 结合所有现有系统的所有功能,那么它会变得过于复杂。同样,他们相信,他们也不能让 JMS 只局限于所有系统共有的那些特性。

制定者相信,让 JMS 包括实现“高级的企业应用程序”所需要的所有功能是很重要的。

JMS 规范中声明, JMS 的目标是:

  • 定义一组消息公用概念和实用工具。
  • 最少化程序员使用消息时必须学习的概念。
  • 最大化消息应用程序的可移植性。
  • 最小化实现一个提供者所需的工作量。
  • 为点对点和 pub/sub 提供客户机接口。“域”是用于在前面讨论的消息模型的 JMS 术语。(注意:提供者不需要实现两个域。)

3.jms的模式

    (1)点到点(point -to -point) ,

图中 clientA-->clientC,clientA-->clientD 就是 点到点 的模式; 其中clientA 就是 生产者,C和D就是消费者;

使用这种模型,客户端发送消息到队列目的地(Queue),从这个队列里面只有一个消息接收者可以收到那个消息,其他访问同一目的地的接收者不会接收到该消息

如clientC 从A那里消费了msg1 消息后,D就不能消费同样的消息了;所以clientD 消费Msg2。

点到点的模式主要特点就是:

① 每条消息只能有一个消费者(customer);一旦一条message被消费了之后,就不能被其他消费者接收。

②发送和接收消息和时间(时效)关系不大,但是要有一个前提就是:就是消息没有过期,没有被其他用户接收走

③ 消费者必须确认消费被接收,否则JMS服务提供者会认为该消息没有被接收,那么这条消息仍然可以被其他人接收。程序可以自动进行确认,不需要人工干预。

非持久的消息最多只发送一次

⑤持久的消息严格发送一次

我们可以将比较重要的消息设置为持久化的消息,持久化后的消息不会因为JMS服务提供者的故障或者其他原因造成消息丢失。

(2)topic(pub/sub) 发布订阅模型

关于这个模型,可能比较熟悉;因为之前在写redis的高级应用的文章中有提过这个。如图中的clientB --》clientE 和clientF 就是这个,就发布者发布的消息,可以

同时被多个订阅者接收。

发布/订阅模型的特点:

①每个消息都可以有多个(0,1,……)订阅者

②订阅者只能消费他们订阅之后出版的消息

这就要求订阅者必须先订阅,生产者再发布。即订阅者必须先运行,再等待生产者的运行,这和点对点类型有所差异。

③订阅者必须保持为活动状态才能使用这些消息

即订阅者必须保持活动状态等待发布者发布的消息,如果订阅者在发布者发布消息之后才运行,则不能获得先前发布者发布的消息。

4.JMS的消息中间件

说到这里要先解释一下MOM?

面向消息中间件(mom)为分布式应用 系统开发提供异步,解耦,稳定,可扩展和安全的行为。mom在分布式计算领域是一个重要的概念。它允许应用

开发使用代理器api在分布式应用 环境实现各种功能。总之,mom的设计原理就是作为消息发送者和接收者的中间人使用。这个中间人提供了一个高级别的解耦。

而且由于jms是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,分布式系统中发送消息,进行异步通信。Java消息服务是

一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。接下来就介绍下这几种mom:

1).IBM MQ 系列产品提供的服务使得应用程序可以使用消息队列进行交流,通过一系列基于 Java 的 API 提供了 MQseries 在 Java 中应用开发的方法。它支持点到点和发布/订阅两种消息模式。

2).WebLogic是BEA公司实现的基于工业标准的J2EE应用服务器,支持大多数企业级JavaAPI,它完全兼容 JMS 规范,支持点到点和发布/订阅消息模式,它支持消息的多点广播、持久消息存储的文件和数据库、XML 消息,以及动态创建持久队列和主题。

3).JBoss 是 JBoss 公司开发的一个免费开源的应用服务器,它提供了 EJB 运行的环境,并能够结合 EJB 进行 JMS 消息的收取,支持点到点模型和发布/订阅模型。
4).ActiveMQ 是一个基于 Apache 2.0 Licenced 发布的开放源代码的 JMS 产品,它能够提供点到点消息模式和发布/订阅消息模式,支持 JBoss、Geronimo 等开源应用服务器,支持 Spring 框架的消息驱动,新增了一个 P2P 传输层,可以用于创建可靠的 P2P JMS 网络连接,拥有消息持久化、事务、集群支持等 JMS 基础设施服务。
5).OpenJMS 是一个开源的 JMS 规范的实现,它支持点对点模型和发布/订阅模型,支持同步与异步消息发送、可视化管理界面,支持 Applet,能够与 Jakarta Tomcat 这样的 Servlet容器结合,支持 RMI、TCP、HTTP 与 SSL 协议。

我之前参与几个项目中就用到IBM WebSphere MQ,以及activemq ;当然这些都是后话了。

5.jms 的接口

jms的接口如图中所示,(以及jms的两种模式继承的接口):

JMS Parent

PTP Domain

Pub/Sub Domain

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver

TopicSubscriber

   jms接口的描述:

ConnectionFactory:连接工厂,JMS用它创建连接

ConnectionJMS 客户端到JMS Provider 的连接

Destination:消息的目的地

Session:一个发送或接收消息的线程

MessageProducer (message的生产者)Session对象创建的用来发送消息的对象

MessageConsumer (message的消费者)Session对象创建的用来接收消息的对象

6.jms的消息

jms的消息由三模块组成的: header(消息头)、属性、和body(消息实体)

消息头:主要是设置消息的失效时间、提供发送和接收识别标识、消息路由等 :如header.setJMSMeassageId();

属性:由消息发送者产生,用来添加删除消息头以外的附加信息。 名称没有限制,用户可随便定义;分三类:应用程序定义属性、JMS定义属性、提供者自定义属性

消息实体: 发送到接收应用程序的内容。每一个消息接口都专用于它所支持的内容类型。JMS中定义了5种消息体:ByteMessageMapMessageObjectMessageStreamMessage TextMessage

7.jms开发编程实现

一个完整的jms 开发流程:

(1).通过 JNDI 查询 ConnectionFactory

(2).通过 JNDI 查询一个或者多个 Destination

(3).用 ConnectionFactory 创建一个Connection

(4).用 Connection 创建一个或者多个Session

(5)用 Session Destination 创建所需要的 MessageProducerMessageConsumer

(6)启动 Connection


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章