`
hain
  • 浏览: 455570 次
  • 来自: ...
社区版块
存档分类
最新评论

Java消息服务基础

    博客分类:
  • ejb
阅读更多
在不同系统之间交换信息的一大障碍是如何在精确交换和格式化数据方面取得一致。Java Message Service( Java消息服务,简称JMS)通过提供一种与J2EE应用程序或传统系统交互的方法部分的解决了这个问题。
  JMS的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断网络连接的客户机,诸如移动电话和PDA的最好的选择。另外, JMS采用一种宽松结合方式整合企业系统的方法,其主要的目的就是创建能够使用跨平台数据信息的、可移植的企业级应用程序,而把开发人力解放出来。
  Java消息服务支持两种消息模型:Point-to-Point消息(P2P)和发布订阅消息(Publish Subscribe messaging,简称Pub/Sub)。JMS规范并不要求供应商同时支持这两种消息模型,但开发者应该熟悉这两种消息模型的优势与缺点。
  P2P消息模型是在点对点之间传递消息时使用。如果应用程序开发者希望每一条消息都能够被处理,那么应该使用P2P消息模型。与Pub/Sub消息模型不同,P2P消息总是能够被传送到指定的位置。
  Pub/Sub模型在一到多的消息广播时使用。如果一定程度的消息传递的不可靠性可以被接受的话,那么应用程序开发者也可以使用Pub/Sub消息模型。换句话说,它适用于所有的消息消费程序并不要求能够收到所有的信息或者消息消费程序并不想接收到任何消息的情况。
  JMS通过允许创建持久订阅来简化时间相关性,即使消息预订者未激活也可以接收到消息。此外,使用持久订阅还可通过队列提供灵活性和可靠性,而仍然允许消息被发给许多的接收者。
  Topic Subscriber topic Subscriber =
  topicSession.createDurableSubscriber(topic, subscriptionName);
  Connection对象表示了到两种消息模型中的任一种的消息系统的连接。服务器端和客户机端对象要求管理创建的JMS连接的状态。连接是由Connection Factory创建的并且通过JNDI查寻定位。
  //取得用于 P2P的 QueueConnectionFactory
  QueueConnectionFactory = queueConnectionFactory( );
  Context messaging = new InitialContext( );
  QueueConnectionFactory = (QueueConnectionFactory)
  Messaging.lookup(“QueueConnectionFactory”);
  //取得用于 pub/sub的 TopicConnectionFactory
  TopicConnectonFactory topicConnectionFactory;
  Context messaging = new InitialContext();
  topicConnectionFactory = (TopicConnectionFactory)
  messaging.lookup(“TopicConnectionFactory”);
  注意:用于P2P的代码和用于PublishSubscribe的代码非常相似。
  如果session被标记为transactional的话,确认消息就通过确认和校正来自动地处理。如果session没有标记为 transactional,你有三个用于消息确认的选项。
  · AUTO_ACKNOWLEDGE session将自动地确认收到一则消息。
  · CLIENT_ACKNOWLEDGE 客户端程序将确认收到一则消息,调用这则消息的确认方法。
  · DUPS_OK_ACKNOWLEDGE 这个选项命令session“懒散的”确认消息传递,可以想到,这将导致消息提供者传递的一些复制消息可能会出错。这种确认的方式只应当用于消息消费程序可以容忍潜在的副本消息存在的情况。
  queueSession = queueConnection.createQueueSession(false, session.AUTO_ACKNOWLEDGE);//P2P
  topicSession = topicConnection.createTopicSession(false, session.AUTO_ACKNOWLEDGE); //Pub-Sub
  注意:在本例中,一个session目的从连结中创建,非值指出session是non-transactional的,并且 session将自动地确认收到一则消息。
  JMS现在有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要接收所有的消息时才使用。
  虽然 JMS规范并不需要JMS供应商实现消息的优先级路线,但是它需要递送加快的消息优先于普通级别的消息。JMS定义了从0到9的优先级路线级别,0是最低的优先级而9则是最高的。更特殊的是0到4是正常优先级的变化幅度,而5到9是加快的优先级的变化幅度。举例来说:
  topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub
  或
  queueSender.send(message, DeliveryMode.PERSISTENT, 8, 10000);//P2P
  这个代码片断,有两种消息模型,映射递送方式是持久的,优先级为加快型,生存周期是10000 (以毫秒度量 )。如果生存周期设置为零,这则消息将永远不会过期。当消息需要时间限制否则将使其无效时,设置生存周期是有用的。
  JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
  · StreamMessage -- Java原始值的数据流
  · MapMessage--一套名称-值对
  · TextMessage--一个字符串对象
  · ObjectMessage--一个序列化的 Java对象
  · BytesMessage--一个未解释字节的数据流
  JMS应用程序接口提供用于创建每种类型消息和设置荷载的方法例如,为了在一个队列创建并发送一个TextMessage实例,你可以使用下列语句:
  TextMessage message = queueSession.createTextMessage(); message.setText(textMsg);
  以异步方式接收消息,需要创建一个消息监听器然后注册一个或多个使用MessageConsumer的JMS MessageListener接口。会话(主题或队列)负责产生某些消息,这些消息被传送到使用onMessage方法的监听者那里。
  import javax.jms.*;
  public class ExampleListener implements MessageListener {
  //把消息强制转化为TextMessage格式
  public void onMessage(Message message) {
  TextMessage textMsg = null;
  // 打开并处理这段消息
  }
  }
  当我们创建QueueReceiver和TopicSubscriber时,我们传递消息选择器字符串:
  //P2P QueueReceiver
  QueueReceiver receiver;
  receiver = session.createReceiver(queue, selector);
  //Pub-Sub TopicSubscriber
  TopicSubscriber subscriber;
  subscriber = session.createSubscriber(topic, selector);
  为了启动消息的交付,不论是Pub/Sub还是P2P,都需要调用start方法。
  TopicConnection.start( ); //pub-sub
  QueueConnection.start( ); //P2P
  TopicConnection.start ( );// pub-sub
  QueueConnection.start ( );// P2P
  当一条消息被捕捉时,这条消息做为一条必须被强制转化为适当消息类型的普通Message对象到达。这是一个被用来提取或打开消息内容的getter方法。下列代码片段使用StreamMessage类型。
  private void unPackMessage (Message message) {
  String eName;
  String position;
  double rate;
  StreamMessage message;
  Message = session.createStreamMessage( );
  //注意下面的代码必须按照我给出的顺序书写
  message.writeString(eName);
  message.writeString(position);
  message.writeDouble(rate);
  //实现处理消息的必要的程序逻辑
  }
  停止消息的传递,无论是Pub/Sub还是P2P,都调用stop方法。
  TopicConnection.start( ); //pub-sub
  QueueConnection.start( ); //P2P
  TopicConnection.start ( );// pub-sub
  QueueConnection.start ( );// P2P
  其他的J2EE组件--servlet或EJB--可以当作消息生产者;然而,它们可能只能同步操作,这可能是因为它们的请求-应答的性质决定的。虽然XML目前还不是被支持的消息类型,发送一个XML文件和创建一条文本类型消息以及把XML文件添加到消息的有效负载都一样简单,都是以非专有的方式传送数据。值得注意的是,一些JMS供应厂商已经提供了可用的XML消息类型。但是使用非标准的消息类型可能会出现可移植性问题。
  String reportData; //reportData内容为XML 文档
  TextMessage message;
  message = session.createTextMessage();
  message.setText (reportData);
  消息驱动组件(MDB)是一个当消息到达时被容器调用的异步消息消费程序。和entity和session EJB不同,MDB没有本地和远程接口并且是匿名的;它们对于客户是不可见的。MDB是JMS系统的一部分,作为消费者实现服务器上的商业逻辑程序。 一个客户程序可能通过使用JNDI定位一个与MDB相关联的JMS。 例如:
  Context initialContext = new InitialContext();
  Queue reportInfoQueue = (javax.jms.Queue)initialContext.lookup
  (“java:comp/env/jms/reportInfoQueue”);
  MDB是由Bean类和相应的XML部署描述符组成。 Bean 类实现MessageDriveBean 接口:
  import javax.ejb.*;
  import jms.Message.*;
  public interface MessageDriveBean {
  public void ejbCreate();
  public void ejbRemove();
  public void setMessageDrivenContext(MessageDrivenContext ctx);
  }
  消息监听器接口:
  import javax.jms.*;
  public interface MessageListener {
  public void onMessage( );
  }
  部署描述符
  <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_2_0.d  
分享到:
评论

相关推荐

    java消息服务基础书籍

    java消息服务基础书籍 消息类型,消息内容,过滤,以及常用消息中间件

    java消息服务(第二版)

    Java消息服务(JMS,Java Message Service)是Java平台中用于企业级应用间通信的一种中间件技术,它为分布式环境中的应用程序提供了一种可靠的消息传递机制。在《Java消息服务(第二版)》这本书中,读者可以深入...

    java ee基础使用教程

    Java EE(Java Platform, Enterprise Edition)是Java平台上用于构建企业级Web应用的框架集合,它提供了丰富的服务和组件,使得开发者能够快速开发出分布式、多层架构的应用程序。本教程由知名讲师郑阿奇编著,旨在...

    分布式Java应用基础与实践pdf

    3. **JMS**:Java消息服务是用于在分布式环境中传递异步消息的标准API。它支持点对点(P2P)和发布/订阅(Pub/Sub)两种模式,使得应用程序可以解耦并实现可靠的数据传输。 4. **EJB**:企业JavaBean是Java EE平台...

    消息总线java实现

    为了构建一个简单的Java消息总线,我们需要以下几个关键组件: 1. **消息接口**:定义消息的通用结构,包括消息头(用于标识和路由)和消息体(实际数据)。例如,可以创建一个`Message`接口,包含`getHeader()`和`...

    java网络编程基础

    在这个"java网络编程基础"的示例中,我们有两个核心文件:TalkServer.java和TalkClient.java,它们分别代表了网络通信中的服务器端和客户端角色。 首先,我们要理解服务器端(TalkServer.java)的工作原理。在Java...

    Java+EE基础实用教程

    7. **JMS**:Java消息服务允许应用程序之间异步通信。通过消息队列,系统可以解耦生产者和消费者,提高系统的可扩展性和可靠性。 8. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一个统一的接口,...

    java-Push开源实时消息推送系统

    Java-Push开源实时消息推送系统是一种基于Java技术构建的、专为实现高效、稳定、实时的消息推送服务而设计的解决方案。在当今互联网应用中,实时消息推送已经成为提高用户体验和互动性的重要工具,尤其是在社交网络...

    java工程师应聘基础知识

    Java工程师在应聘过程中,需要扎实的Java基础知识作为支撑。这些基础涵盖了多个方面,例如多线程、企业级JavaBean(EJB)、JavaServer Pages(JSP)和Servlet等。了解并掌握这些知识点对于成为一名合格的Java开发...

    JMS(java消息服务学习必备

    java消息服务学习必备,JMS基础知识了解

    使用Java Web服务构建SOA

    Java Web服务基础 Java Web服务通常基于SOAP(Simple Object Access Protocol)协议,使用WSDL(Web Services Description Language)定义服务接口,并通过UDDI(Universal Description, Discovery, and ...

    java socket通信自定义消息协议

    总的来说,Java Socket通信自定义消息协议涉及网络编程基础、数据结构设计以及异常处理等多方面知识。通过这个过程,我们可以灵活地构建满足特定需求的通信系统,实现客户端和服务器间的高效交互。

    Java Web服务:构建与运行(第2版)1-3-4章源代码

    第1章通常会介绍Web服务的基础概念,包括什么是Web服务,Web服务的工作原理,以及为何选择Java作为开发Web服务的平台。这一章可能会涉及SOAP(简单对象访问协议)、WSDL(Web服务描述语言)和UDDI(统一描述、发现和...

    java做的短消息平台通过网络进行收发信息平台

    Java构建的短消息平台是一种基于网络的通信系统,它允许用户通过互联网发送和接收文本、图片、音频甚至视频等各类消息。这样的平台在现代社会中扮演着至关重要的角色,尤其是在企业级应用、社交网络以及客户服务等...

    Java Web服务开发

    作者简介:Ramesh Nagappan是Sun Java中心的Enterprise Java架构师,拥有13年的从业经验,擅长于设计和实现基于Java、XML和COBRA的分布式计算体系结构,可适用于Internet应用程序、企业消息交换和Web服务。...

    Java EE基础实用教程[郑阿奇]

    JMS是Java消息服务,用于在Java应用之间传递消息,提供异步通信的能力。在大型系统中,JMS可以实现解耦,提高系统的可扩展性和可靠性。 JPA是Java持久化API,它是Java EE中用于对象关系映射(ORM)的标准。JPA允许...

    (开发入门)分布式java基础与实践

    分布式Java基础与实践是开发者进入大型系统开发领域的重要学习内容,尤其对于初学者而言,掌握这一领域的基础知识至关重要。本文将围绕分布式系统、Java在其中的角色以及实践应用进行深入讲解。 首先,分布式系统是...

    java消息中间件

    **Java消息服务**(Java Message Service, JMS)是Java平台中的一个API,用于实现两个应用程序之间的消息传递。JMS支持两种类型的消息模型:点对点(Point-to-Point, PTP)和发布/订阅(Publish/Subscribe, Pub/Sub)。 -...

Global site tag (gtag.js) - Google Analytics