`

jms异步消息机制

    博客分类:
  • JMS
阅读更多

 在分布式企业级应用程序中,异步消息机制用于有效地协调各个部分的工作。
  J2EE为我们提供了JMS和消息驱动Bean(Message-Driven Bean),用来实现应用程序各个部件之间的异步消息传递。
  一.什么是消息系统?
  通常一个消息系统允许分开的未耦合的应用程序之间可靠地异步通信。在企业应用时,需要一种异步的,非阻塞的消息传递。比如,一个客户端可能希望给一个服务器发送一个请求后,不在乎是否马上能得到回应。这样,客户端没有理由必须等待服务器处理请求。客户端应用程序在递交一个请求之后,只需确保请求到达服务器端后,就可以处理其他任务。通常,这是很高效的。消息系统提供了许多其他分布式对象计算模型没有的优点。它鼓励在消息产生者和使用者之间的"松耦合",在它们之间有很高程度的事务处理。对于使用者,它不在乎谁产生了消息,产生者是否仍在网络上以及消息是什么时候产生的。这就允许建立动态的,可靠的和灵活的系统。整个的子系统能被修改而不会影响系统的其他部分。
  另外的优点包括:系统的高度可扩展性,容易与其他系统进行集成,以及高度的可靠性。由于可靠性和可扩展性,使得它们用于解决许多商业和科学计算问题。比如,消息系统是许多应用程序的基础,这些应用程序可以是工作流,网络管理,通信服务或供应链管理程序。在JAVA技术中,处理异步消息的能力是通过JMS来实现的。JMS最初设计是为了给传统的消息对象中间件提供一个标准的JAVA接口。而这些产品是在一个企业级应用程序中必须的。现在出现了许多支持JMS的纯JAVA的产品。
  消息系统类型
  通常有两种消息类型。
  1.发布/订阅(publish/subscribe)
  发布/订阅消息系统支持一个事件驱动模型,消息产生者和使用者都参与消息的传递。产生者发布事件,而使用者订阅感兴趣的事件,并使用事件。产生者将消息和一个特定的主题(Topic)连在一起,消息系统根据使用者注册的兴趣,将消息传给使用者。
  2.点对点(Peer to peer)
  在点对点的消息系统中,消息分发给一个单独的使用者。它维持一个"进入"消息队列。消息应用程序发送消息到一个特定的队列,而客户端从一个队列中得到消息。
  二.JMS简介
  JMS的目的是提供给消息系统客户一个固定的接口,而且与底层的消息提供者无关。这样,客户端的应用程序可以在不同的机器和操作系统中移植,而且能在不同的消息系统产品之间转移。JMS客户端都是建立在JAVA技术上的,从而也能使用其他JAVA API,如JDBC数据库连接,使用JAVA BEAN组件模型,JDNI名字服务,JTA客户端事务处理控制以及J2SE和J2EE API来实现企业级应用服务程序。
  1.JMS对象模型
    
 
 

  图1显示了JMS对象,用于提供JMS客户端与JMS服务提供者相连的对象。
  ConnectionFactory是一个客户端用来创建一个Connection的管理对象。由于在Connection创建时有授权和通信建立过程,因此这个对象是比较大的。
  Destination对象将一个消息的目的和服务提供者有关的地址及配置信息包装起来。
  Session是JMS实体,用来支持事务处理和异步消息消费。JMS并不需要客户端的代码用于异步消息消费或能处理多个并发消息。通常,事务的复杂性都由一个Session来封装。
  一个Session是一个原子单位的工作,与数据库的事务一样,要实现多线程事务比较困难。Session提供了在一个线程编程模式下的并发的优点。
  MessageProducer和MessageConsumer对象由Session对象创建。用于发送和接受消息。为了确保消息的传递,JMS服务提供者处理的消息都要处于PERSISTENT模式。PERSISTENT模式使得JMS提供者出问题后,也能让消息保存下来。
  Session,MessageProducer和MessageConsumer都不支持并发,而ConnectionFactory,Destination和Connection都支持并发。
  2.JMS应用程序开发
  JMS中的消息
  在消息系统中,应用程序之间通信的关键是消息。因此使用JMS必须要先理解消息。
  在JMS中,消息由三部分组成:
  MESSAGE HEADER用于识别消息,比如用于判断一个给定的消息是否是一个"订阅者"
  PROPERITIES用于与应用程序相关的,提供者相关的和可选项的信息
  BODY是消息的内容,支持几种格式,包括TextMessage(对String一个简单的封装)和ObjectMessage(对任意对象的封装,但必须支持序列化),也支持其他格式。
  TextMessage
  一个TextMessage是一个String对象的封装。在只有文本对象传递时,是很有用的。它假设许多消息系统是建立在XML上的。从而TextMessage就可以成为包装它们的容器。
  创建一个TextMessage对象很简单,如下面的代码:
  TextMessage message=session.createMessage();
  message.setText("Hello, world!");
  ObjectMessage
  如名字所示,它是对一个JAVA对象的封装的消息。任何可序列化的JAVA对象都能用于ObjectMessage,如果必须将多个对象封装在一个消息里传递,可以使用Collection对象,来包括多个序列化对象。
  下面是创建一个ObjectMessage
  ObjectMessage message=session.createObjectMessage();
  message.setObject(myObject);
  创建一个JMS客户端程序
  一个典型的JMS客户端由下面的几个基本步骤来创建:
  创建一个到消息系统提供者的连接(Connection)
  创建一个Session,用于接收和发送消息
  创建MessageProducer和MessageConsumer来创建和接收消息
  当完成了上述步骤后,一个消息产生者客户端将创建并发布消息到一个主题,而消息使用者客户端会接收与一个主题相关的消息。
  1.创建一个Connection
  一个Connection提供客户端对底层的消息系统的访问。并实现资源的分配和管理。通过使用一个ConnectionFactory来创建一个Connection,通常用JDNI来指定:
   
  2.创建一个Session
  Session是一个比较大的JMS对象,他提供了生产和消费消息的手段。用于创建消息使用者和消息产生者。
  topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
  两个参数用于控制事务和消息确认。
  3.定位一个Topic
  用JDNI来定位一个Topic,Topic用于识别发送或接收的消息,在发布/订阅系统中。订阅者订阅一个给定的Topic,而发布者将它发布的消息与一个Topic相连。
  下面是创建一个Topic "WeatherReport"
  Topic weatherTopic=messaging.lookup("WeatherReport");
  4.启动Connection
  在上面的初始化步骤之后,消息流是禁止的,用于防止在初始化时发生不可预料的行为。一旦初始化结束,必须让Connection启动消息系统。
  topicConnection.start();
  5.创建一个消息产生者
  在发布/订阅里,一个产生者发布消息到一个指定的Topic。下面的代码显示创建一个产生者,以及后续的建立和发布一个简单文本消息。
  TopicPublisher publisher=session.createPublisher(weatherTopic);
  TexeMessage message=session.createMessage();
  message.setText("ssss");
  publisher.publish(message);
  下面是一个消息使用者的代码
  
  三.消息驱动Bean简介
  异步消息也可以由消息驱动Bean来实现。在EJB 1.1规范中,定义了两种类型的EJB。分别是实体Bean(Entity Bean)和会话Bean(Session Bean)。客户端通常是以同步的,阻塞方式来调用Bean的方法。消息驱动Bean将EJB和JMS的功能结合在一起。
  正如前述,会话Bean通常实现商务逻辑,客户端不能共享一个会话Bean。实体Bean通常和一些在永久存储中的一些实体条目相对应的。这两种Bean通常都有REMOTE和HOME接口,用来与客户端交互。并且,这些交互都是同步的,阻塞方式进行的。比如,一个请求发送给一个Bean,通过阻塞式方法调用,服务器返回一个相应。调用者在收到返回后,才能进行下一步处理。消息驱动Bean通常配置成是一个特别的主题(topic)或队列的客户端,作为消息的使用者。但消息驱动Bean没有HOME和REMOTE接口。一个消息产生者将消息写入TOPIC或队列时,并不知道使用者是一个消息驱动Bean。这就允许集成一个分布式的计算系统时,有很大的灵活性。消息驱动Bean没有会话性质的状态,所有的实例在不处理请求时是相同的,这与无状态会话Bean是类似的。将Bean的实例放在缓冲池里,也是高效处理消息驱动Bean的一种方法。一个消息驱动Bean必须间接或直接地从javax.ejb.MessageDrivenBean接口继承而来。这个接口是由javax.jms.MessageListener继承而来。这个方法的一个参数是javax.jms.Message。可以是任何有效的JMS消息类型。方法的申明中并不包含一个thrown语句。因此在消息处理中,不会仍出应用程序异常。当容器接收到消息时,它首先是从一个缓冲池里得到现成的一个消息驱动Bean,然后,如果配置文件需要的,容器还要设置一个和事务处理上下文的一个联系。当这些管理任务完成时,接收到的消息传递给onMessage()方法。一旦方法完成,事务确认或返回,Bean又被重新放回到缓冲池。
  ejbRemove()在把消息驱动Bean从任何存储上删除时调用。并进行清楚操作和垃圾收集。必须在ejbRemove()方法中释放所有Bean的实例用到的资源。
  setMessageDri

分享到:
评论

相关推荐

    J2EE的异步消息机制

    总的来说,J2EE的异步消息机制通过JMS提供了强大的工具,允许企业应用在高并发、高负载的环境中实现高效、可靠的通信,增强了系统的灵活性和稳定性。开发者利用这些机制可以构建出能够应对复杂业务场景的企业级解决...

    JMS异步通信

    Java消息服务(JMS)是Java平台上用于异步通信的标准API。它允许应用程序通过消息传递在分布式系统中进行通信,从而实现解耦和提高...通过截图和教程,WSAD提供了一个全面的平台,帮助开发者理解和实现JMS异步通信。

    JMS消息队列机制及案例

    **JMS消息队列机制详解** Java Message Service(JMS)是Java平台中用于企业级应用间异步通信的一种标准接口。它定义了生产、发送、接收和读取消息的标准API,使得不同的消息中间件提供商可以提供兼容的实现,便于...

    WSAD环境下JMS异步通信全攻略

    如前所述,在JMS之前,J2EE原来是一个建立在Java RMI-IIOP通信协议基础上的同步环境,但MDB却具有接收异步消息的能力。  异步通信使得企业应用能够建立在一种全新的通信机制之上,它具有如下重要优点:  ■ ...

    使用Spring JMS轻松实现异步消息传递.pdf

    Java 消息服务 (JMS) API 是实现异步消息传递的标准,但其原始使用方式涉及复杂的资源管理和异常处理。 传统的 JMS 实现涉及多个步骤,包括 JNDI(Java Naming and Directory Interface)查询来查找队列连接工厂和...

    使用Spring JMS轻松实现异步消息传递.docx

    **Spring JMS 实现异步消息传递** 在 IT 领域,特别是在 Web 应用开发中,异步消息传递是一种提高系统效率和响应性的重要技术。传统的同步处理方式可能会导致用户等待时间较长,尤其是在处理复杂的业务逻辑或者需要...

    javaEE 异步消息处理

    6. **消息确认**:为了确保消息的正确传递,JMS提供了消息确认机制。服务器会等待客户端确认接收到消息,如果未收到确认,服务器可能会重新发送消息。 7. **线程池处理**:在描述中提到的"容器里用线程去处理",这...

    基于EASERVER的异步消息,已测试通过

    【基于EASERVER的异步消息】是一种在企业级应用中常见的通信机制,它允许应用程序在不阻塞当前处理流程的情况下发送和接收消息。EASERVER是BEA Systems(现已被Oracle公司收购)开发的一款中间件平台,它提供了强大...

    JMS经典实例 基于weblogic

    6. **连接工厂**:为生产者和消费者提供连接到JMS提供者的机制。 在WebLogic中配置JMS,你需要完成以下步骤: 1. **创建JMS模块**:定义JMS资源的容器,如队列和主题。 2. **创建目的地**:根据需求创建消息队列或...

    浅析WebLogic服务器上异步消息的接收

    2. JMS(Java Message Service)的集成:在WebLogic服务器中,异步消息通常是通过Java消息服务(JMS)来实现的。JMS是一种消息传递的标准,提供了创建、发送、接收和读取消息的API。WebLogic提供了JMS服务,使得...

    J2EE的异步消息机

    J2EE在分布式企业级应用程序中,异步消息机制用于有效地协调各个部分的工作。J2EE为我们提供了JMS和消息驱动豆(Message-Driven Bean),用来实现应用程序各个部件之间的异步消息传递.

    JMS 教程 - 消息队列、消息服务

    **恢复机制**:JMS支持消息的恢复机制,这意味着当系统发生故障时,可以通过备份和恢复机制来恢复未完成的事务和未处理的消息。 通过理解这些概念和技术,开发者可以更好地利用JMS构建出高效、可靠的企业级消息服务...

    JMS消息发送及订阅

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的标准接口。它提供了一种可靠的消息传递机制,使得应用程序可以在分布式环境中交换信息。在这个主题中,我们将深入探讨JMS消息...

    JMS消息模型 JMS学习.doc

    5. **JMS Exception Handling**:JMS规范定义了异常处理机制,确保在遇到错误时,消息系统能够适当地恢复或通知应用程序。 6. **JMS in Application Servers**:JMS通常集成在J2EE(Java 2 Enterprise Edition)...

    消息中间件和JMS消息服务.pdf

    消息中间件是一种软件层,用于在分布式环境中提供异步通信机制。它允许应用程序之间通过消息进行交互,而不是直接调用彼此的服务。这种架构的主要优点在于: 1. **异步通信**:发送方无需等待接收方处理完毕即可...

    使用SpringJMS轻松实现异步消息传递

    北京火龙果软件工程技术中心异步进程通信是面向...它提供的模板机制隐藏了典型的JMS实现的细节,这样开发人员可以集中精力放在处理消息的实际工作中,而不用担心如何去创建,访问或清除JMS资源。本文将对SpringJMSAP

    J2EE中的JMS 消息服务

    Java Message Service(JMS)是Java平台上的一个标准接口,用于在分布式环境中提供异步的消息传递服务。它允许应用程序创建、发送、接收和读取消息,使得应用程序可以解耦,提高系统的可扩展性和可靠性。在J2EE...

    JMS的中文教程(Java的消息驱动)

    JMS的主要目标是为Java应用程序提供一种异步通信机制,通过消息队列或主题来实现。 **重要性**:在企业级应用中,JMS被广泛应用于解耦系统组件、实现分布式事务处理、提高系统的可伸缩性和可靠性等方面。对于深入...

    JMS消息服务详解

    在JMS中,消息是一个用于企业应用间异步通信的重要概念,它包含必要的业务信息,如请求、报告和事件。消息由三个主要部分组成:消息头、消息属性和消息体。消息头包含标准信息,如ID、优先级和目标;消息属性是可选...

    jms消息通讯

    在J2EE(Java 2 Platform, Enterprise Edition)框架下,JMS扮演着至关重要的角色,它提供了可靠的消息传递机制,确保数据在不同的组件之间得以高效且安全地传输。 首先,我们需要理解JMS的核心概念。JMS提供两种...

Global site tag (gtag.js) - Google Analytics