当前位置:  技术问答>java相关

谁有JMS的技术文档,中英文不限,up有分,不够另外再加!

    来源: 互联网  发布时间:2015-11-07

    本文导语:  My email:owen.yang@achievo.com | MessageDrivenBean 在 EJB 2.0 中,对规范的一个基础性更改是添加了一种全新的企业级 bean 类型,即 MessageDrivenBean。MessageDrivenBean 专门设计来处理入网的 JMS 消息。...

My email:owen.yang@achievo.com

|
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 的详细信息发送给消息收发主题。 

public class ShoppingCartBean implements SessionBean { // 订单详细信息是一个可序列化的对象,它包含全部订单信息。 public OrderDetail orderDetail; 

public void processOrder(){ 

// 处理订单的逻辑从此处开始 .... 

// ... 处理订单以后,向其它系统发送有关此订单的一条消息 InitialContext jndiEnc = new InitialContext(); 

// 使用 JNDI ENC 获取 JMS 工厂和主题标识符 TopicConnectionFactory factory = jndiEnc.lookup(“java:comp/env/jms/topicfactory“); 

Topic orderTopic = jndiEnc.lookup(“java:comp/env/jms/ordertopic“); 

// 获得一个用来发送消息的发布者 TopicConnection con = factory.createTopicConnection(); TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE ); TopicPublisher publisher = session.createPublisher(orderTopic); 

// 将一个 ObjectMessage 发送给主题(虚拟通道) ObjectMessage message = session.createObjectMessage(); message.setObject(orderDetail); publisher.publish(message); con.close(); } ... } 


在这种情况下,JMS 是用来通知另外的应用程序,订单已被处理。这些另外的应用程序对于处理订单来说并不重要,但它们会因为得到一个订单已被处理的通知而受益。这样的例子包括自动调整库存的库存系统,和能将客户添加进产品目录邮寄名单中的销售应用程序。 

使用 JMS 使 bean 能够发布(发送)消息而不会发生阻塞。bean 并不知道谁将收到消息,因为它是将消息发送给某个主题(虚拟通道),而不是直接发送给另一个应用程序。应用程序可以选择预订该主题,并接收有关新订单的通知。这样就有可能动态地在虚拟通道中添加或删除应用程序,从而产生了一种更加灵活的系统。 

预订了订单主题的应用程序将收到有关新订单的通知,应用程序可以使用它们认为合适的任何方式来处理这个通知。预订了各种主题的应用程序或者从各个队列中接收消息的应用程序可以是 Java 应用程序、EAI 系统(用于集成遗留系统和 ERP 系统)或者 MessageDrivenBean 组件,在 JMS 的术语中,它们全部被认为是 JMS 客户机。 

JMS 和 MessageDrivenBean 虽然大多数 JMS 厂商都提供消息中介工具,来将消息从发送者路由到接收者,但构建使用(接收)消息的 JMS 客户机却是应用程序开发人员的职责。在许多情况下,接收消息的应用程序必须强健、安全、快速而且可伸缩;它需要的基础结构基本上与 EJB 应用程序相同。 

由于认识到这种需要,EJB 2.0 现在包括了 MessageDrivenBean 类型,它可以使用 JMS 消息,并且在同一个强健的、基于组件的基础结构中处理这些消息,这样的基础结构对于会话 bean 和实体 bean 都非常有用。MessageDrivenBean 类型(消息 bean)是一种企业级 bean 组件,它设计来使用异步的 JMS 消息。 

除了提供容器基础结构以外,EJB 还具有另一个重要的优点:并发处理。在 EJB 中,一个已部署的消息 bean 表示一个单一的消息使用者,但这个 bean 本身是由许多 bean 实例提供服务的。每个 bean 实例都可以分别地使用消息 bean 接收到的消息。这意味着,消息 bean 不必像常规 JMS 客户机那样连续地使用消息。消息 bean 可以并发地使用接收到的多个消息,这样就能达到比传统 JMS 应用程序高得多吞吐量和好得多的可伸缩性。 

为了说明消息 bean 的作用,就开发了 MarketingBean 类,并将它从订单主题中部署到供使用的消息中去。MarketingBean 将从消息中提取 OrderDetail 对象,并使用它将客户添加到适当的目录邮寄名单中。这是一种最精致的大量邮寄系统。 

下面是 MarketingBean 类的定义,这个类使用发布给订单主题的消息。 

public class MarketingBean implements javax.ejb.MessageDrivenBean { 

public void onMessage(Message message) { 

ObjectMessage orderMessage = (ObjectMessage)orderMessage: OrderDetail orderDetail = (OrderDetail)orderMessage.getObject(); 

Integer customerID = orderDetail.getCustomerID(); 

InitialContext jndiEnc = new InitialContext(); CatalogHome catalogHome = (CatalogHome)jndiEnc.lookup(“java:comp/env/ejb/catalog“); 


Iterator productIDs = orderDetail.getProductsIDs(); while(productIDs.hasNext()){ Integer productID = (Integer)productIDs.next(); Catalog cat = CatalogHome.findByProductID(productID); cat.addCustomerToMailingList(customerID); } } } 



正像会话 bean 和实体 bean 一样,MessageDrivenBean 也是一种完备的企业级 bean,但其间仍存在一些重要的区别。消息 bean 没有远程接口或本地接口。这是因为消息 bean 不是 RPC 组件。它没有供 EJB 客户机调用的业务方法。消息 bean 监听虚拟消息通道(主题或队列),并使用其它 JMS 客户机发送给该通道的消息。 

各个消息 bean 构成一个 bean 类,这个类实现 MessageDrivenBean 接口和一个 XML 部署描述符。下面是 MessageDrivenBean 接口的定义,所有消息 bean 都必须实现这个接口。 

package javax.ejb; import javax.jms.Message; import javax.jms.MessageListener; 

public interface MessageDrivenBean extends MessageListener{ public void onMessage(Message message); public void ejbCreate(); public void ejbRemove(); public void setMessageDrivenContext(MessageDrivenContext mdc); } 



当部署了一个消息驱动的 bean 以后,它就被指派来处理特定主题或队列中的消息。JMS 客户机(Java 应用程序、bean 或本地客户机)发送的任何消息,将由消息路由器转发给消息 bean,该消息 bean 正是被指派来从该虚拟通道中接收消息的。当一条消息被发送给一个消息 bean 时,EJB 容器就会从某个池中选择该 bean 的一个实例,来处理这条消息。当 bean 实例调用其 onMessage() 方法时,它就会接收到这条消息,并能够以它认为合适的任何方式来处理这条消息。一旦这条消息被使用,则只要事务没有异常中止,这条消息都不会被传送给这个消息 bean 的任何其它实例。 

消息 bean 在某点上类似于无状态的会话 bean,即这两种 bean 在两次请求之间都不保持任何状态。因此,消息驱动的 bean 是无状态的,但是,就像无状态的会话 bean 一样,它们也可以有实例变量,这些变量在这个 bean 实例的整个生存期内均保持。 

对消息 bean 的最后一点说明是,理解这样一个事实是很重要的,即 bean 使用的消息不一定要是由其它 bean 所产生的。消息 bean 可以使用由符合 JMS 的厂商提供的任何主题或队列中的

|
消息中间件 

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

消息中间件大致分为两类: 

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_tutorial 就写的差不多了,在sun的网站有下载。
还有看看jms 1.2的规范也不错,做了很多改动。

|
http://java.sun.com/products/jms/tutorial/

|
up

|
呵呵

|
up

|
http://e-docs.bea.com/wls/docs61/jms

装个wls再实践一下 :)

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JMS监控器 Hermes JMS
  • RMI via JMS
  • JMS4Spread
  • 请有经验的兄弟们谈谈JMS应用需要哪些成本??
  • JMS服务器 FFMQ
  • JMS服务器 JBossMQ
  • JMS消息服务器 ActiveMQ
  • 哪有、谁能给我javax.jms包,先谢了,不好意思只让给21分
  • 这里有使用JMS做企业通信的吗
  • ###########谁有JMS的例子(发组播消息的)或者相关的经验,请进来帮帮我,一定送高分!!!
  • jms所能传递的消息体最大可以有多大,不影响系统性能。
  • JMS服务器 DropboxMQ
  • JMS服务器 SwiftMQ
  • JMS for j2ms
  • 大家推荐一本EJB和JMS方面的好书把
  • weblogic中的JMS是怎么配置的,50分相送,解决立刻给分,在线等待……
  • 作一个局域网内的类似QQ的东西,用JMS好不好?
  • 大家来讨论一下JMS比较适合应用在那些方面
  • 哪位可以解释一下jms,及其与ejb2.0的相关内容。推荐一些资料和具体网址更好,谢谢。
  • 使用jms可以实现自己开发的系统中的广播功能吗?各位有没有什么其他的好方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3