什么是 JMS?

 

MessageDrivenBean 在 EJB 2.0 中,对规范的一个基础性更改是添加了一种全新的企业级 bean 类型,即 MessageDrivenBean。MessageDrivenBean 专门设计来处理入网的 JMS 消息。对于许多开发人员来说,JMS 是一种新的范例,所以本文将花一些时间逐步说明对 JMS 的理解,以及它们在 EJB 2.0 中的用法。

什么是 JMS? JMS 是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC (Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA 的 Weblogic JMS service 和 Progress 的 SonicMQ,这只是几个例子。

JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本 (TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

消息收发系统是异步的,也就是说,JMS 客户机可以发送消息而不必等待回应。比较可知,这完全不同于基于 RPC 的(基于远程过程的)系统,如 EJB 1.1、CORBA 和 Java RMI 的引用实现。在 RPC 中,客户机调用服务器上某个分布式对象的一个方法。在方法调用返回之前,该客户机被阻塞;该客户机在可以执行下一条指令之前,必须等待方法调用结束。在 JMS 中,客户机将消息发送给一个虚拟通道(主题或队列),而其它 JMS 客户机则预订或监听这个虚拟通道。当 JMS 客户机发送消息时,它并不等待回应。它执行发送操作,然后继续执行下一条指令。消息可能最终转发到一个或许多个客户机,这些客户机都不需要作出回应。

EJB 2.0 中的 JMS EJB 2.0 以两种方式支持 JMS 的集成:作为一种 bean 可用的资源,和作为一个 MessageDrivenBean。当将 JMS 用作一种资源时,使用 JMS API 的 bean 就是消息的产生者或发送者。在这种情况下,bean 将消息发送给称为主题或队列的虚拟通道。另一方面,MessageDrivenBean 则是消息的使用者或接收者。它监听特定的虚拟通道(主题或队列),并处理发送给该通道的消息。为了更好地理解消息产生者和消息使用者的作用,用 SessionBean bean 来发送一条使用 JMS 的消息,然后使用一个新的 MessageDrivenBean 来使用该同一条消息。

作为 EJB 2.0 资源的 JMS 会话 bean 和实体 bean 都是基于 RPC 的组件,为了将各种事务性的组件装配到一起,这是一种卓越的体系结构。但是,在某些情况下,RPC 的同步性质会成为一种障碍,这正是 EJB 1.1 中将对 JMS API 的访问作为一种资源包括在内的原因。利用 JNDI 环境命名的上下文,bean 可以获得一个 JMS 工厂,并将一条异步消息发送给主题或队列(也从 JNDI 获得),而不必等待回应。下面是 ShoppingCart bean 的一个例子,它使用 JMS 将 Order 的详细信息发送给消息收发主题

息中间件

消息中间件提供企业数据的异步传输,通过消息中间件,一些原本互相孤立的业务组件可以组合成一个可靠的、灵活的系统。

消息中间件大致分为两类

Point-to-Point(PTP)

Publish-Subscribe(Pub/Sub)

PTP是点对点传输消息,建立在消息队列的基础上,每个客户端对应一个消息队列,客户端发送消息到对方的消息队列中,从自己的消息队列读取消息。 Pub/Sub是将消息定位到某个层次结构栏目的节点上,Pub/Sub通常是匿名的并能够动态发布消息,Pub/Sub必须保证某个节点的所有发布者(Publisher)发布的信息准区无误地发送到这个节点的所有消息订阅者(Subscriber)。

什么是JMS(Java Message Service)

JMS定义了Java中访问消息中间件的接口。

JMS只是接口,并没有给予实现,实现JMS接口的消息中间件叫JMS Provider,这样的消息中间件可以从Java里通过JMS接口进行调用。

JMS和其他企业级Java API的关系

JDBC JMS客户端可以使用JDBC接口,可以将JDBC和JMS包含在一个事务里。这种包含可以在EJB里,也可以直接调用JTA(Java Transaction API)接口实现。

JavaBeans JavaBeans可以用JMS Session发送接收消息。

EJB

对于EJB组件来说,JMS和JDBC一样,是一个很重要的企业级服务资源。目前的EJB规范定义客户端只能同步调用EJB,未来的规范将会定义通过一个JMS客户端发消息异步调用EJB组件。

JTA(Java Transaction API) JMS客户端可以用JTA启动事务。JMS Provider可以选择是否支持分布式事务。

JTS(Java Transaction Service) JMS可以和JTS一起组成一个分布式事务,如将发送接收消息和更新数据库包含在一个事务里。

JNDI JMS 客户端通过JNDI调用JMS中的对象。

JMS 消息模型

JMS消息由两部分构成:header和body。header包含消息的识别信息和路由信息,body包含消息的实际数据。

根据数据格式,JMS消息可分为以下五种

BytesMessage 消息是字节流。

MapMessage 消息是一系列的命名和值的对应组合。

ObjectMessage 消息是一个流化的Java对象。

StreamMessage 消息是Java中的输入输出流。

TextMessage 消息是一个字符串,这种类型将会广泛用于XML格式的数据。

JMS 消息优先级

邮局发信分为平信和特快专递两种,同样JMS也根据消息的轻重缓急将消息分为0-9十个级别。0-4是普通消息,5-9是加急消息。JMS不要求消息中间件严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。

Apusic对JMS的支持

Apusic Application Server包含一个完全遵循JMS接口规范开发的消息中间件,Apusic消息中间件支持通常的两种消息中间件:PTP和Pub/Sub。

### JMS系统的定义与功能 Java消息服务(Java Message Service,简称JMS)是一种用于在分布式系统中实现应用程序之间异步通信的API。它提供了一种可靠的消息传递机制,使得不同的应用程序可以相互通信而无需直接连接[^1]。JMS支持两种主要的消息传递模型:点对点(Point-to-Point,简称P2P)发布/订阅(Publish/Subscribe,简称Pub/Sub)。 #### 点对点(P2P)模型 在P2P模型中,消息生产者将消息发送到一个队列(Queue),而消费者从该队列中接收消息。每个消息只能被一个消费者消费,确保消息的唯一性可靠性[^2]。 #### 发布/订阅(Pub/Sub)模型 在Pub/Sub模型中,生产者将消息发布到一个主题(Topic),而多个订阅者可以同时接收这些消息。这种模型允许多个消费者接收相同的消息,适用于广播式的消息传递场景[^3]。 #### JMS系统的工作原理 JMS通过消息中间件(Message Broker)来管理消息的传递过程。消息中间件负责接收、存储转发消息,确保消息能够正确地从生产者传递到消费者。以下是JMS系统工作的一些关键特性: 1. **异步通信**:生产者消费者不需要同时在线。消费者可以在生产者发送消息之后的任意时间接收消息。 2. **消息持久化**:如果消费者暂时不可用,消息可以被持久化存储,直到消费者恢复并接收消息为止[^4]。 3. **消息确认**:消费者可以确认消息已被成功接收,从而确保消息不会丢失。 4. **事务支持**:JMS支持事务处理,允许将多条消息作为一个整体进行提交或回滚[^5]。 ```java // 示例代码:创建一个JMS生产者并发送消息 import javax.jms.*; public class JMSSender { public static void main(String[] args) throws JMSException { // 创建连接工厂连接 ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = factory.createConnection(); connection.start(); // 创建会话目的地 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("TEST QUEUE"); // 创建消息生产者并发送消息 MessageProducer producer = session.createProducer(destination); TextMessage message = session.createTextMessage("Hello, JMS!"); producer.send(message); // 关闭资源 session.close(); connection.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值