自己搞了J2EE这么久,EJB/JNDI/RMI/JTA这些都了解的七七八八。但是,对于JMS这个东东,只听说在EJB的消息bean中有用到过,一直以来俺都敬而远之。最近公司要做一个国外的外包项目,里头有涉及到JMS的技术,现在只能临时抱佛脚。互联网上关于JMS的文章少之又少,没办法,只有自力更生,硬是查看了SUN的官方技术API文档,也算是初步揭开JMS这个神秘的面纱吧。
JMS的基本概念
JMS(Java Message Service) 的主要目的是为了在我们的Java程序之间用分布式的方式实现对消息的创建、发送、接收和读取。一个典型的JMS应用,主要包含以下几个部分:
●JMS Provider -- JMS的核心模块,用来控制和管理JMS应用。如果说JMS整个是一个十字路口,那么这个Provider应该就充当交通信号灯和交警的角色了。
●JMS Clients -- 接收和发送message的Java程序终端,简单的说应该就是交互的源/目标对象,可以有一个或多个Clients存在。
●Messages -- 在JMS Clients中间传递交互的消息对象,这是JMS最基本的媒体单元。
●Administered Objects -- 由JMS Provider创建和定义,然后提供给JMS Clients使用。 JMS定义了两种 Administered Objects:
1) ConnectionFactory:提供给Clients使用,用来建立和JMS Provider之间的连接。
2) Destination:在Clients之间交互时,携载了消息对象的发送源与接收目标。
●JMS Clients是通过JNDI的方式来查找这些Administered Objects的。
●Non-JMS Clients -- 使用本地消息的API来实现的Clients。
此外,JMS可以在不同的域对象之间实现以下两种方式的消息传输机制:PTP(Point-to-Porint)和Pub/Sub(Publish-and-Subscribe),这两种方式可以并存于同一个应用之中。PTP是点对点传输消息,建立在消息队列的基础上,每个客户端对应一个消息队列,客户端发送消息到对方的消息队列中,从自己的消息队列读取消息。 Pub/Sub是将消息定位到某个层次结构栏目的节点上,Pub/Sub通常是匿名的并能够动态发布消息,Pub/Sub必须保证某个节点的所有发布者(Publisher)发布的信息准区无误地发送到这个节点的所有消息订阅者(Subscriber)。
我们不需要仔细去了解这两种方式的意义,JMS在此提供了一个更加统一的实现方式,该方式主要有以下几个接口:ConnectionFactory、Connection、Destination、Session(消息交互线程的上下文环境)、MessageProducer(消息的发送者)、MessageConsumer(消息的接收者)。
使用JMS API不仅使通信变得松散耦合,而且它还使通信变得:
●异步:JMS提供者将到来的消息发送给客户,客户不用发送请求接收消息。
●可靠:JMS API确保消息传送一次而且只传送一次。可靠性差的应用程序可能会丢失消息或者重复接收消息
这里,我不想详细去写一个JMS应用的Demo。简单的就其API文档所提供的资料,来总结一下吧。
JMS应用中的消息发送
1、获得一个上下文环境:
Context ctx = new InitialContext();
2、通过JNDI查找来建立一个ConnectionFactory对象:
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("java:JmsXA");
3、通过JNDI查找来建立一个或多个Destination对象:
Destination dest = (Queue) ctx.lookup("queue/A");
4、通过ConnectionFactory创建一个JMS Connection连接:
Connection conn = cf.createConnection();
5、创建一个或多个JMS Session对象:
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
6、使用一个Session对象和Destination对象,合作创建一个MessageProducer(消息发送端):
MessageProducer msgp = session.createProducer(dest); //此处的dest已经被强制为P2P Queue对象
QueueSender sender = (QueueSender) msgp;
//此处发送端指明采用的是 PTP的方式来实现JMS。当然你也可以用Pub/Sub的方式来实现
Destination dest = (Topic) ctx.lookup("queue/A");
...
TopicPublisher sender = (TopicPublisher) msgp;
7、通过某个Session建立一个或多个JMS Message对象:
//此处仅以文字消息发送为例,您也可以建立和发送MapMessage, BytesMessage, ObjectMessage, StreamMessage
TextMessage msg = session.createTextMessage();
msg.setText("消息详细内容");
8、在已有的连接上,开始发布我们已经建立好的消息对象:
sender.send(msg);
9、关闭已经建立的连接:
conn.close();
JMS应用中的消息接收
1-5:同发送过程的初始化步骤1-5,因为是消息的接收方,JNDI的寻址方式应该同于发送方,这里的JNDI相当于是双方接头的暗号。
6、使用一个Session对象和Destination对象,合作创建一个MessageConsumer(消息接收端):
MessageConsumer msgconsumer = session.createConsumer(dest);
7、启动这个已经建立的连接,准备接收来自发送方的消息:
conn.start();
8、截获来自发送端的消息:
TextMessage msg = (TextMessage) msgconsumer.receive();
String message = msg.getText();
9、关闭已经建立的连接:
conn.close();
以上的消息接收端成功的接收了一条消息,如果我们要监控JMS消息的接收事件,需要在第7步之前,声明一个实现了MessageListener接口的对象:
MessageListener ml = new JmsListenner();
msgConsumer.setMessageListener(ml);
这里的JmsListenner是我们自定实现的一个MessageListener,其中关键的事件是:
public void onMessage(Message message);
一个Session对象可以同时控制旗下的多个Consumer对象和MessageListener对象,但是这个Session是一个单线程模式的传递机制,即:必须在当前Message对象被onMessage处理之后,才能继续接收下一条异步传送过来的Message对象。
总结
以上是我对JMS的一个初步的了解,也希望在以后的工作中对此有更进一步的认识,很乐意和大家探讨 :)
分享到:
相关推荐
它提供了一套全面的API和服务,包括Web组件、Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JPA(Java Persistence API)等,用于构建分布式、可伸缩的企业系统。 2. **字节码文件(....
ActiveMQ是Apache软件基金会的一个开源项目,它是一个基于Java消息服务(JMS)的应用服务器,专门用于处理消息传递。在深入了解ActiveMQ之前,我们先来了解一下JMS是什么。JMS是一种标准,它定义了如何在分布式环境...
4. **JMS(Java Message Service)**:用于实现异步通信,允许应用程序之间通过消息传递进行解耦。 5. **JTA(Java Transaction API)**:提供事务管理,确保跨多个操作的一致性和可靠性。 6. **JPA(Java ...
7. **JMS(Java Message Service)**:讲解如何使用JMS进行异步通信和消息队列。 8. **Web服务**:涵盖SOAP和RESTful Web服务的创建和消费,包括JAX-WS和JAX-RS。 9. **部署与测试**:介绍如何使用WAR和EAR文件...
《初识JavaEE 5:从新手到专家》是一本专为Java EE 5初学者设计的优秀教程。这本书深入浅出地介绍了Java企业版5(Java EE 5)的各种核心技术,旨在帮助读者快速掌握这一强大的企业级开发平台。Java EE 5是Java应用...
《初识Java EE 6平台:使用GlassFish 3从新手到专业》是一本专为初学者准备的Java企业级应用开发指南。该书通过深入浅出的方式,引导读者掌握Java EE 6平台的核心概念和技术,同时利用GlassFish 3服务器进行实践。源...
《初识J2EE:构建企业级应用的基石》 J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台的一个版本,专为构建企业级分布式应用程序而设计。这个平台提供了丰富的服务和组件,使得开发人员可以高效地...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它基于Java Message Service (JMS) API,为分布式系统提供高效、可靠的消息传递服务。本资料集合包含了一套完整的ActiveMQ学习教程,适合研究者深入理解其原理...
README.md通常包含了项目的简介、安装指南、快速入门等内容,是初识项目的第一手资料。对于Spring Framework 4.2,它可能详细描述了如何搭建开发环境,如何运行示例,以及项目的总体架构和设计理念。 通过深入研究...
从初识语法到熟练掌握各种框架和技术,每一步都需要扎实的基础和不断的实践。 首先,Java学习的基础是掌握基本语法和核心概念,如操作对象、条件语句(if)、循环(for)、集合(List、Set、Map)以及线程、IO和...
《初识EJB 3应用开发:从新手到专家》是一部深入浅出的教程,旨在帮助读者全面理解和掌握企业级JavaBean(EJB)3的开发技术。此压缩包包含了书籍的各个章节样本代码,方便读者实践和学习。以下是根据章节标题解析出...
JavaEE包含了多种服务,如Java Servlet、JavaServer Pages (JSP)、JavaMail、Java Persistence API (JPA) 和Java Message Service (JMS) 等,这些服务为开发人员提供了构建企业级应用的框架和工具。 2. **Tomcat...
《初识Java™ EE 6平台与GlassFish™ 3:从新手到专业》这本书是为那些想要深入了解Java企业级应用开发的初学者和进阶者准备的。它全面覆盖了Java EE 6平台的核心技术和GlassFish服务器的使用,帮助读者从零基础开始...
#### 核心知识点:Mule ESB的初识与环境搭建 **Mule**是一个高度灵活、基于Java的集成平台,旨在简化企业级应用程序之间的通信和数据传输。它支持多种消息传递模式,如点对点(P2P)、发布/订阅(Pub/Sub),并兼容各种...
- **Data Access/Integration**:包括JDBC、ORM、OXM、JMS模块,用于数据访问和集成,支持多种持久化技术。 - **Web**:包括Web、Web-Servlet、Web-Portlet模块,提供Web应用的支持,如MVC框架。 - **AOP(面向切...
1. **第一部分:初识Camel** - 第1章介绍了Camel的基本概念和工作原理,包括如何在项目中引入Camel,以及通过简单的示例理解Camel的路由和组件。 - 第2章深入讲解了Camel的路由机制,演示了如何使用Camel构建复杂...
#### 一、初识Java:安装与环境配置 在开始学习Java之前,最重要的是准备好开发环境。这通常包括安装JDK(Java Development Kit),这是开发Java程序的基础工具包。JDK包含了编译、运行Java程序所需的工具和文档,...