在公司快两年了,也跟着团队做了几个项目;期间写过很多个接口,有使用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用它创建连接
Connection:JMS 客户端到JMS Provider 的连接
Destination:消息的目的地
Session:一个发送或接收消息的线程
MessageProducer: (message的生产者)由Session对象创建的用来发送消息的对象
MessageConsumer: (message的消费者)由Session对象创建的用来接收消息的对象
6.jms的消息
jms的消息由三模块组成的: header(消息头)、属性、和body(消息实体)
消息头:主要是设置消息的失效时间、提供发送和接收识别标识、消息路由等 :如header.setJMSMeassageId();
属性:由消息发送者产生,用来添加删除消息头以外的附加信息。 名称没有限制,用户可随便定义;分三类:应用程序定义属性、JMS定义属性、提供者自定义属性
消息实体: 发送到接收应用程序的内容。每一个消息接口都专用于它所支持的内容类型。JMS中定义了5种消息体:ByteMessage、MapMessage、ObjectMessage、StreamMessage和 TextMessage。
7.jms开发编程实现
一个完整的jms 开发流程:
(1).通过 JNDI 查询 ConnectionFactory
。
(2).通过 JNDI 查询一个或者多个 Destination
。
(3).用 ConnectionFactory
创建一个Connection
。
(4).用 Connection
创建一个或者多个Session
。
(5)用 Session
和
Destination
创建所需要的 MessageProducer
和MessageConsumer
。
(6)启动 Connection
。