JMS (Java Message Service)是由SUN开发的一套API,它为开发者提供一套访问MOM(Message-Oriented Middleware:面向消息中间件)的标准方法。
JMS 分为两种消息域PTP(点对点)和Pub/Sub(发布/订阅)。PTP消息被产生者放入到一个队列中,消费者则从小消息列队中取走消息,消息一担取走,消息就从队列中移除。Pub/Sub消息和PTP最大的不同在于发布者发布一条消息后可以发送给所有订阅者,所有订阅者都拥有处理某一条消息的机会。(如图1)
(图1)
发布者A 发布者B
| |
--------MOM 消息中间件-----------------------
| 娱乐/音乐 it/管理 |
________________________________
订阅者A 订阅者B 订阅者C (都能享受上面的服务,不用理会谁发布的)
JMS的一些重要接口
ConnectionFactory :创建一个受管理对象
Connection :连接到提供者的活动连接
Destination :一个封装消息目标地址的受管理对象,如消息的来源地和发送滴,根据消息域的不同有两个接口:Queue 和 Topic,前者对应PTP消息的目标地址,后者对应Pub/Sub消息的目标地址。
Session :发送和接受消息的单线程环境。(即一次会话)
MessageProducer:用于发送消息
MessageConsumer:用于接收消息
JMS高级接口与特定域接口(位于javax.jms包中)
高级接口 PTP域子接口 PUB/SUB域子接口
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
Connection QueueConnection TopicConnection
Destination QueueDestination TopicDestination
Session QueueSession TopicSession
MessageProducer QueueMessageProducer TopicMessageProducer
MessageConsumer QueueMessageConsumer TopicMessageConsumer
一个典型的JMS程序要经过以下步骤才能开始创建和使用消息
1、通过JNDI查询ConnectionFactory
2、用ConnectionFactory创建一个Connection
3、用Connection创建一个或多个Session
4、通过JNDI查询一个或多个Destination
5、用Session和Destination创建对应的MessageProducer和MessageConsumer
6、启动Connection
JMS消息结构
JMS根据不同应用的用途定义了多种消息类型,由Message接口派生而来,一个Message由Header、Properties和Body三个部分组成。
Header是一组标准键值字段,客户端和提供者都用它来标识和路由消息。
Properties用于弥补Header的不足,可以通过手工设置其他的属性,Message提供了set<Type>Property(String name)和get<Type>Property()方式来让开发者任意定义属性。
Body消息正文,包括了发送给其他程序的消息内容,根据消息体内容的不同,JMS拥有5个消息类型,并分别通过Message的5个子接口来描述。
消息类型 说明
TextMessage 消息是一个字符
ObjectMessage 消息是一个实现了Serializable接口的对象
MapMessage 消息是一个MAP,包括一组键值对元素,键位一个字符,值为任意对象
BytesMessage 消息是一个二进制数组
StreamMessage 消息是一组JAVA原始类型数据,这些数据通过标准流操作按顺序进行填充和读取
消息收发的机制:
JMS事务使用了Session对它进行操作,分别拥有支持事务语义的3个方法,通过这些方法启动,提交和回滚一个事务,这些方法分别是begin()、commit()和rollback()。
消息确认是接收者在成功接收到消息后,将一个回执发送给MOM,告之已经成功接收到一种通知机制。确认方式有三种分别是:
1、 Session.AUTO_ACKNOWLEDGE:在完成接收消息时,Session自动发送一个确认回执。
2、 Session.CLIENT_ACKNOWLEDGE:由客户端程序通过手工调用Message.acknowledge()方法显示确认接收。
3、 Session.DUPS_OK_ACKNOWLEDGE:让Session延迟发送确认回执。
例如:创建一个不需事务,自动确认的session方式
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
消息选择是一种选择机制,类似于SQL的查询条件。
发送消息例子:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.jms.Destination;
publicclass MessageSender {
/**
*发送方法
*@parammsgText
*/
publicvoid send(String msgText){
// 获取jms连接
Connection connection = null;
try {
// 获取JNDI上下文
InitialContext ctx = new InitialContext();
ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");
// 获取Destination 目标地址
Destination dest = (Destination)ctx.lookup("jndi/dest");
ctx.close();
// 获取一个MOM的连接
connection = cFactory.createConnection();
// 创建JMS会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个指定特定目标地址的消息发送者
MessageProducer sender = session.createProducer(dest);
// 建立Body内容
TextMessage message = session.createTextMessage(msgText);
// 发送给服务器
sender.send(message);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
接收消息例子:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
publicclass MessageReceiver {
/**
*接收方法
*/
publicvoid receive(){
Connection connection = null;
try {
// 创建JNDI上下文
InitialContext ctx = new InitialContext();
ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");
// 获取目标地址信息
Destination dest = (Destination)ctx.lookup("jndi/dest");
ctx.close();
// 获取连接
connection = cFactory.createConnection();
// 获取连接对话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建一个指向特定目标地址的消息消费者
MessageConsumer receiver = session.createConsumer(dest);
// 接收发送请求中的消息信息
TextMessage textMsg = (TextMessage)receiver.receive();
System.out.println("获取内容:" + textMsg.getText());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/csevan/archive/2008/04/30/2346370.aspx
分享到:
相关推荐
JMS学习手册是一份宝贵的参考资料,它涵盖了JMS的基础概念、程序开发、配置和监控等方面的知识,尤其适合初学者以及希望加深理解JMS原理和实践的开发者。 JMS规范定义了一组接口和相关语义,这些接口用于创建、发送...
1. **JMS Provider**:JMS提供者是实现JMS规范的具体产品,它是消息服务的核心。它为应用提供消息的创建、发送、接收以及管理等功能。JMS提供者通常是跨平台的,可以在各种环境中运行,比如在applet中。 2. **JMS ...
**JMS学习笔记精心总结** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的一种标准接口。它允许应用程序创建、发送、接收和读取消息,使得应用程序能够在不直接连接的情况下...
**JMS学习笔记(一)——JMS简介与ActiveMQ安装** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的标准接口。它为应用程序提供了一种标准的方式,用来创建、发送、接收和读取...
### JMS 学习资源详解 #### 一、JMS 基本概念与通信模型 JMS(Java Message Service)是一种广泛应用于企业级应用程序之间的消息传递标准,它定义了一系列接口,用于创建、发送、接收消息。JMS 的设计目标是简化...
Java消息服务(Java Message Service,简称JMS)是一种在分布式环境中进行可靠消息传递的标准API,由Sun Microsystems与消息导向中间件(MOM)供应商共同制定。JMS的主要目标是为了解决应用程序之间的异步通信问题,...
**JMS学习教程概述** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的一种标准API。它允许应用程序创建、发送、接收和读取消息,为分布式系统提供了可靠的、跨平台的通信...
在JMS学习的过程中,了解和掌握以下几个关键概念至关重要: 1. **消息(Message)**:是数据的载体,它封装了要传输的信息,可以是文本、二进制数据或对象。JMS定义了几种不同类型的Message,如TextMessage、...
**JMS学习笔记** Java消息服务(Java Message Service,简称JMS)是Java平台中用于在分布式环境中交换异步消息的标准API。它提供了一种可靠的消息传递机制,使得应用程序可以在不互相依赖的情况下进行通信,从而...
JMS 详细实例学习教程 JMS(Java Message Service)是一种基于Java平台的消息服务规范,用于在分布式系统中异步通信。JMS提供了一种灵活、可靠、可扩展的消息传递机制,使得应用程序之间可以相互通信和交换数据。 ...
【JMS学习指导(Weblogic下的)】 Java Message Service (JMS) 是Java平台上的一个标准API,旨在简化企业级应用程序之间的消息交换。它提供了一种标准的方式,让Java应用程序能够生产、发送和接收消息,从而与其他...
JMS是Java Platform, Enterprise Edition(Java EE)的一部分,用于实现分布式应用程序之间的消息传递。它提供了一种与语言无关、面向消息中间件(MOM)的标准API,允许Java EE应用程序组件创建、发送、接收和读取...
**JMS简介** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的标准化API,...通过学习和理解JMS的基础知识,我们可以构建出稳定、可靠的分布式系统,实现不同服务间的解耦和异步通信。
### ActiveMQ_JMS学习资料深度解析 #### 一、JMS基本构件详析 ##### 连接工厂(Connection Factory) 连接工厂是JMS架构中的关键组件,负责创建与JMS服务提供商之间的连接。例如,ActiveMQ提供了`...
通过学习以上资料,读者可以全面理解JMS的工作原理,熟悉如何在Java应用中实现异步通信,从而提升系统的可扩展性和可靠性。同时,对于那些需要处理大量并发请求或需要解耦组件的大型分布式系统来说,JMS的知识将成为...
1. **消息**: 消息是JMS中的基本数据单元,它包含了要传递的信息。消息可以是文本、对象或者二进制数据,通过消息体、头和属性来定义其格式和目标。 2. **消息队列(Message Queue)与主题(Topic)**: JMS提供了两...
通过对Spring JMS源码的深入学习,我们可以更深入地理解其工作原理,从而更好地利用这个强大的工具来构建高可用、高可靠的分布式系统。同时,这也有助于我们在遇到问题时能快速定位和解决,提升我们的故障排查能力。
本文主要探讨的是消息中间件(Message-Oriented Middleware,简称MOM),特别是在Java消息服务(Java Message Service,JMS)的学习笔记。 JMS是Java平台上的一个标准API,用于在分布式环境中进行异步消息传递。它...
1. **ConnectionFactory**: 这是Spring配置中定义的一个bean,用于创建与JMS服务器的连接。通常,我们需要指定JNDI名称,以便Spring能够通过JNDI查找并获取ConnectionFactory实例。 2. **Destination**: 这是消息的...
1. **点对点(Point-to-Point)模型**:这是JMS的基本模型之一,其中消息从一个生产者发送到一个队列,然后由一个或多个消费者接收。每个消息仅被一个消费者处理。在这个demo中,可能包含了创建生产者、消费者,以及...