- 浏览: 706641 次
- 性别:
- 来自: 北京
-
博客专栏
-
-
读金庸故事,品程序人生
浏览量:47821
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
1. 介绍
JMS((Java Message Service:Java消息服务)也是JavaEE很重要的标准之一,企业应用组件互相需要通讯,就引出了面向消息的模式来进行消息互通。基于消息服务的方式不需要消息发送方与消息接收方进行任何的耦合,甚至可以不需要知道彼此的存在。这种通讯方式既可以是同步的、也可以是异步的(因业务需求不同开发者可自己定制)。官方的解释如下:
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当做“QQ”,每个QQ使用人可以当做企业中的一个小组件,其中一个人A君具备查询大量数据的功能,另一个人B君具备破解密码的功能。能解码的人需要能查询大量数据的人提供查询数据的服务。这个时候B君就用QQ和A君通讯:“嗨,哥们,给我一个密码的密文,我来破解!”,消息发到QQ服务器,通过网络传输将此消息传达给A君,A君收到消息后开始工作,将查询结果return给服务器,服务器再将return的结果传给了B君,B君拿到密文结果后接下来自己再工作。
以上是一个同步消息的例子,没有反馈的密文,B君无法进行下一步的工作,他会一直等待A君给他的反馈。
如果B君下一步的工作不是严格依赖于A君的反馈信息,则完全可以采用异步的方式进行消息的传输。比如B君可以这样发消息说:“我要自己破解手中已经收到的一个密文了啊,哥们,如果你在线,给我一个回复就行!一会儿可能需要您的配合……”。
这样即使A君不在线,没收到这个消息,也不会影响B君下一步的工作执行。
2. 角色说明
JMS分为3个角色
1. JMS消息生产者:顾名思义,一个消息的发起者
2. JMS消息的消费者:顾名思义,这个消息的实际读取、处理者
3. JMS消息服务器:路由来自各方的JMS消息的服务器,通常也就是指着应用服务器,比如Weblogic、JBoss等都提供了JMS消息服务支持。另外,JMS生产者都是将消息发送到一个目的地、消息消费者也是从该目的地去取得消息。这个目的地也就是在应用服务器上。JMS消息也是通过应用服务器这个“中介公司”传达的。
由此看来,JMS的消息规范体系和QQ的信息原理更加吻合了。
3. 发送与消费方式
点对点PTP方式:
咱们还是拿QQ来举例子,这种方式就好比上面的例子,一个人和另一个人进行单一的通讯,除了服务器负责转发、路由消息,其他消息消费者不会接收该消息。只有消息目的消费者才能收到此消息。
发布/订阅Pub-Sub方式:
这个就好比一个人往QQ群发送一个消息,所有在这个群中、并且当时在线的人都会接收到来自群里的消息。当然了这里所说的订阅就是表示在群中的人。
实际上在JMS1.1规范推出后,给使用者的感觉,起码在编程上PTP方式和Pub-Sub方式差不太多,对于使用者除了在应用服务器中配置的消息目的地有些差异之外,其他并没太感觉有太大差异(底层会做出区分,根据不同类型的消息会自动调用不同类型的API,典型的多态)。
统一的API接口如下:
JMS1.1接口 |
|
连接工厂接口 |
ConnectionFactory |
JMS连接接口 |
Connection |
会话接口 |
Session |
消息目的接口 |
Destination |
消息生产者接口 |
MessageProducer |
消息消费者接口 |
MessageConsumer |
4. 示例代码
1.PTP消息
首先,我们现在JBoss当中配置一个PTP类型的消息目的
可以看到我配置了一个目的叫做jbossJMS的Resource,那我们就可以往这个消息目的发送JMS消息,并且可以从这个JMS目的消费消息了。
咱们先看消费者代码,当然也应该是先执行消费者代码,等消息生产者生产消息的时候,消费者才能见听到。
package jms.ptp;
import java.util.Properties;
import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException;
/** * 同步接收P2P消息 * * @author liuyan * */ public class JbossSyncMessageReciveriver {
/** * 消息消费者 */ public void reciveMessage() {
try { String Connection_Factory = "ConnectionFactory";
Context context = getInitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context .lookup(Connection_Factory);
Destination dest = (Destination) context.lookup("jbossJMS");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer reciver = session.createConsumer(dest);
TextMessage textMessage = (TextMessage) reciver.receive();
String messageText = textMessage.getText();
System.out.println("textMessage:" + textMessage);
System.out.println("消息内容" + messageText);
session.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); }
}
/** * 获得应用服务上下文信息 * * @return */ private Context getInitialContext() { String init_factory = "org.jnp.interfaces.NamingContextFactory"; String serverURL = "jnp://127.0.0.1:1099"; Context context = null;
Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, init_factory); properties.put(Context.PROVIDER_URL, serverURL); try { context = new InitialContext(properties); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return context;
}
/** * @param args */ public static void main(String[] args) {
JbossSyncMessageReciveriver jbossSyncMessageReciveriver = new JbossSyncMessageReciveriver(); jbossSyncMessageReciveriver.reciveMessage(); }
} |
以上是一个同步接收消息的代码,流程是
1):获得应用上下文
2):根据上下文获得连接工厂,此处使用的是JBoss默认的连接工厂
3):从连接工厂里面获取JMS连接Connection
4):用Connection.start()方法,传输JMS消息
5):由JMS连接获得JMS消息回话Session
6):根据消息目的,由JMS会话创建消息消费者
7):同步接收消息,若没接受到消息,线程会阻塞
8):关闭JMS消息资源,session、connection
发表评论
-
JavaEE5实战笔记05RedHat搭建JBoss、Oracle10g环境
2011-06-01 10:50 1616JavaEE5实战笔记在RedHat上搭建JBoss、Orac ... -
JavaEE5实战笔记02JPA持久层的一些问题
2011-05-30 14:48 16441. JPA关联实体的级联操作问题 在此次联系中 ... -
JavaEE5实战笔记01EJB环境搭建及异常解决
2011-05-30 14:43 50871. 说明 此实战笔记是为了之前的学习笔记做一个 ... -
Spring集成ActiveMQ配置
2011-03-21 20:58 279971. 集成环境 Spring采用2.5.6版本, ... -
JAVA的Mina框架传递对象——一劳永逸(转载)
2011-03-09 11:31 2734接触java的Mina框架已经有很多时间了,在网上也读过了很多 ... -
JavaEE5学习笔记12-JSF验证器使用总结
2011-03-09 00:01 19811. JSF验证器 说完转换器就该说说验证器了, ... -
JavaEE5学习笔记11-JSF转换器使用总结
2011-03-08 23:53 27511. JSF的转换器是在JSF生命周期的第2个阶段 ... -
JSF组件生命周期的讨论
2011-03-08 23:38 17411. JSF生命周期 下面我们来看看JSF组件的 ... -
JavaEE5学习笔记10-JSF基本UI控件使用
2011-03-08 23:34 37051. JSF也是JavaEE5的标准,感觉上sun ... -
JavaEE5学习笔记09-将EJB发布成WebService总结(2)
2011-02-28 09:21 1556以上例子只是简单调用了WebService,参数是简单的Str ... -
JavaEE5学习笔记09-将EJB发布成WebService总结(1)
2011-02-28 09:19 41211. 将EJB发布成,或者说暴露成Web服务(也许 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(4)
2011-02-24 09:36 15031. 在JavaEE容器 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(3)
2011-02-24 09:35 12121. 测试代码 部署成功后,在另一个项目中建立测 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(2)
2011-02-24 09:33 1535下面来看针对此实体操作的sessionBean代码。 接口 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(1)
2011-02-24 09:28 1759JPA是JavaEE5提出的一套标准接口,不同的应用服务器对其 ... -
JavaEE5学习笔记06-EJB之消息驱动Bean(MDB)总结----2
2011-02-21 15:56 1452除了activationConfig之外,如果使用其他Java ... -
JavaEE5学习笔记06-EJB之消息驱动Bean(MDB)总结----1
2011-02-21 15:55 19701. 功能介绍 在EJB的分类中还有一个就是消息驱 ... -
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----7
2011-02-21 09:49 13531. EJB的容器式依 ... -
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----6
2011-02-21 09:48 1577BMT就是Bean自己管理事务,这种方式就是以硬编码的方式在B ... -
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----5
2011-02-21 09:46 19171. 有状态的会话Bean的本地、远程调用 其实这 ...
相关推荐
### Java Message Service (JMS) 介绍与使用 在深入探讨Java Message Service(JMS)之前,我们首先明确其在Java EE生态系统中的地位。JMS是Java Platform, Enterprise Edition(Java EE)的一部分,用于实现分布式...
### JavaEE5学习笔记01-JTA和数据库事务:深入解析与应用 #### 一、JavaEE5概览与核心组件 JavaEE5是Java Enterprise Edition的第五个版本,标志着企业级Java应用的一个重要里程碑。它引入了一系列重要的新特性,...
### Java EE 5 学习笔记06:EJB之消息驱动Bean总结 #### EJB 消息驱动 Bean (Message Driven Bean, MDB) 在Java EE 5中,消息驱动Bean(MDB)是一种特殊的EJB组件,它主要用于处理异步消息。MDB能够接收并处理由...
以上就是JavaEE学习笔记中可能涵盖的关键知识点,它们构成了JavaEE开发的基础,并且每个部分都有深入研究的价值。通过学习和实践这些技术,开发者能够构建出高效、稳定和可扩展的企业级Web应用。
### JavaEE 学习笔记概览 #### 一、JavaEE 概念及发展历程 JavaEE(Java Platform, Enterprise Edition)是Sun Microsystems公司为简化企业级应用开发而提出的一套标准化平台,它提供了构建分布式系统的基本框架和...
本"JavaEE2017最新版基础班学习笔记"涵盖了JavaEE入门所需的基本概念和技术,是新手学习JavaEE的良好参考资料。以下将详细介绍其中可能涉及的关键知识点: 1. **Servlet与JSP**:Servlet是JavaEE中处理HTTP请求的...
这个压缩包“JavaEE基础笔记.zip”很可能是包含了一系列关于学习JavaEE基础的文档或者教程,帮助初学者理解并掌握JavaEE的核心概念和技术。 JavaEE作为服务器端的开发平台,它的核心在于提供了一个用于构建分布式、...
这个"Javaee课堂笔记精华总结就业必备"显然是一份针对求职者或初入职场的开发者准备的学习材料,旨在帮助他们掌握JavaEE的核心概念和技术,以提升就业竞争力。 JavaEE平台包括一组服务、APIs和协议,用于构建分布式...
【标题】:“北京圣思园java课堂笔记 (javaSE和javaee)” 提供了全面的Java学习资源,涵盖了从基础的Java Standard Edition (javaSE)到进阶的Java Enterprise Edition (javaEE)的相关知识。 【描述】:“北京圣思园...
总的来说,这个“javaEE示例word版”压缩包是一个全面的JavaEE学习资源,从理论到实践,覆盖了从基础到高级的各种知识点。通过学习和实践其中的内容,开发者可以系统地掌握JavaEE的开发技能,提升构建企业级应用的...
- `javase` 文件夹很可能包含了Java基础知识的学习笔记,如变量、数据类型、运算符、控制结构(if、for、while)、方法、类与对象、封装、继承和多态等概念的解释和实例代码。 2. **Java理论基础**: - 标签中的...
这三年的学习笔记,涵盖了从基础概念到高级特性的广泛知识,对于理解JavaEE的整体架构,掌握SSH和SSM框架的使用,以及优化MySQL数据库操作,都有着极大的帮助。无论你是初学者还是有经验的开发者,都能从中找到提升...
本压缩包文件“《java学习》-Java 学习笔记.zip”包含了丰富的学习资源,帮助初学者和进阶者深入理解Java编程。 1. **Java基础知识** - **语法**:Java的基础语法包括变量、数据类型、运算符、流程控制语句(如if-...
Java EE 技术课堂笔记 本资源是 Java EE 技术课堂笔记,涵盖了 JSP、Servlet、SSH 等关键技术。下面是笔记的详细内容: 一、Java EE 技术概述 Java EE(Java Enterprise Edition)是 Sun Microsystems 公司推出的...