`

消息中间件原理及JMS简介(2)

    博客分类:
  • JMS
阅读更多
本文首先介绍了消息中间件的原理,然后介绍了目前流行的消息中间件产品和一些开源实现。最后详细分析了SUN及其伙伴公司提出的旨在统一各种消息中间件系统接口的规范(JMS)。

  2.3 消息中间件的传递模式

  消息中间件一般有两种传递模型:点对点模型(PTP)和发布-订阅模型(Pub/Sub)。

  1. 点对点模型(PTP)

  点对点模型用于消息生产者和消息消费者之间点到点的通信。消息生产者将消息发动到由某个名字标识的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传动给消费者之前它被存储在这个队列中。队列可以是持久的,以保证在消息服务出现故障时仍然能够传递消息。

  2. 发布-订阅模型(Pub/Sub)

  发布-订阅模型用称为主题(topic)的内容分层结构代替了PTP模型中的惟一目的地,发送应用程序发布自己的消息,指出消息描述的是有关分层结构中的一个主题的信息。希望接收这些消息的应用程序订阅了这个主题。订阅包含子主题的分层结构中的主题的订阅者可以接收该主题和其子主题发表的所有消息。

  多个应用程序可以就一个主题发布和订阅消息,而应用程序对其他人仍然是匿名的。MOM 起着代理(broker)的作用,将一个主题已发表的消息路由给该主题的所有订阅者。

  2.4 消息中间件产品与JMS

  从上个世纪90年代初,随着不同厂商消息中间件大量上市,消息中间件技术得到了长足的发展。目前,IBM和BEA的中间件产品在银行、证券、电信等高端行业,以及IT等行业中得到广泛应用。IBM凭借其在1999年推出的应用服务器WebSphere,扎根金融、证券等行业,在超大型以及系统整合型应用方面优势突出;BEA则是专门从事中间件开发的公司,它的应用服务器WebLogic在美国市场占有率超过60%,在国内电信及证券行业占据主要地位;Sun、Oracle、Sybase和Borland等厂商也都有自己的应用服务器;近年来,以金蝶、东方通等公司为代表的国产中间件产品也发展迅速。

  由于没有统一的规范和标准,基于消息中间件的应用不可移植,不同的消息中间件也不能互操作,这大大阻碍了消息中间件的发展。Java Message Service(JMS, Java消息服务)是SUN及其伙伴公司提出的旨在统一各种消息中间件系统接口的规范。它定义了一套通用的接口和相关语义,提供了诸如持久、验证和事务的消息服务,它最主要的目的是允许Java应用程序访问现有的消息中间件。JMS规范没有指定在消息节点间所使用的通讯底层协议,来保证应用开发人员不用与其细节打交道,一个特定的JMS实现可能提供基于TCP/IP、HTTP、UDP或者其它的协议。

  目前许多厂商采用并实现了JMS API,现在,JMS产品能够为企业提供一套完整的消息传递功能,下面是一些比较流行的JMS商业软件和开源产品。

  1.IBM MQSeries

  IBM MQ系列产品提供的服务使得应用程序可以使用消息队列进行相互交流,通过一系列基于Java的API,提供了MQSeries在Java中应用开发的方法。它支持点到点和发布/订阅两种消息模式,在基本消息服务的基础上增加了结构化消息类,通过工作单元提供数据整合等内容。

  2.WebLogic

  WebLogic是BEA公司实现的基于工业标准的J2EE应用服务器,支持大多数企业级JavaAPI,它完全兼容JMS规范,支持点到点和发布/订阅消息模式,它具有以下一些特点:

  1) 通过使用管理控制台设置JMS配置信息;

  2) 支持消息的多点广播;

  3) 支持持久消息存储的文件和数据库;

  4) 支持XML消息,动态创建持久队列和主题。

  3.SonicMQ

  SonicMQ是Progress公司实现的JMS产品。除了提供基本的消息驱动服务之外,SonicMQ也提供了很多额外的企业级应用开发工具包,它具有以下一些基本特征:

  1) 提供JMS规范的完全实现,支持点到点消息模式和发布/订阅消息模式;

  2) 支持层次安全管理;

  3) 确保消息在Internet上的持久发送;

  4) 动态路由构架(DRA)使企业能够通过单个消息服务器动态的交换消息;

  5) 支持消息服务器的集群。

  4.Active MQ

  Active MQ是一个基于Apcache 2.0 licenced发布,开放源码的JMS产品。其特点为:

  1) 提供点到点消息模式和发布/订阅消息模式;

  2) 支持JBoss、Geronimo等开源应用服务器,支持Spring框架的消息驱动;

  3) 新增了一个P2P传输层,可以用于创建可靠的P2P JMS网络连接;

  4) 拥有消息持久化、事务、集群支持等JMS基础设施服务。

  5.OpenJMS

  OpenJMS是一个开源的JMS规范的实现,它包含以下几个特征:

  1) 它支持点到点模型和发布/订阅模型;

  2) 支持同步与异步消息发送;

  3) 可视化管理界面,支持Applet;

  4) 能够与Jakarta Tomcat这样的Servlet容器结合;

  5) 支持RMI、TCP、HTTP与SSL协议。

  三、消息中间件应用之JMS

  3.1 JMS简介

  Java Message Service 规范 1.1 声称:JMS 是一组接口和相关语义,它定义了 JMS 客户如何访问企业消息产品的功能。

  在 JMS 之前,每一家 MOM 厂商都用专有 API 为应用程序提供对其产品的访问,通常可用于许多种语言,其中包括 Java 语言。JMS 通过 MOM 产品为 Java 程序提供了一个发送和接收消息的标准的、便利的方法。用 JMS 编写的程序可以在任何实现 JMS 标准的 MOM 上运行。

  JMS 可移植性的关键在于:JMS API 是由 Sun 作为一组接口而提供的。提供了 JMS 功能的产品是通过提供一个实现这些接口的提供者来做到这一点的。开发人员可以通过定义一组消息和一组交换这些消息的客户机应用程序建立 JMS 应用程序。[4]

  JMS1.0版本于1998年推出,最新的版本是2002发布的JMS 1.1规范。JMS支持消息中间件的两种传递模式:点到点模式和发布-订阅模式。在JMS 1.1以前的版本中,每一种都有自己的特定于该模式的一组客户机接口。JMS1.1版本提供了单一的一组接口,它允许客户机可以在两个模式中发送和接收消息。这些“模式无关的接口”保留了每一个模式的语义和行为,是实现 JMS 客户机的最好选择。

  统一模式的好处是:

  1) 使得用于客户机的编程更简单。

  2) 队列和主题的操作可以是同一事务的一部分。

  3) 为JMS提供者提供了优化其实现的机会。

  3.2 JMS体系结构

  3.2.1 JMS接口描述

  JMS 支持两种消息类型PTP 和Pub/Sub,分别称作:PTP Domain 和Pub/Sub Domain,这两种接口都继承统一的JMS Parent 接口,JMS 主要接口如下所示:

  JMS Parent

  PTP Domain

  Pub/Sub Domain

  ConnectionFactory

  QueueConnectionFactory

  TopicConnectionFactory

  Connection

  QueueConnection

  TopicConnection

  Destination

  Queue

  Topic

  Session

  QueueSession

  TopicSession

  MessageProducer

  QueueSender

  TopicPublisher

  MessageConsumer

  QueueReceiver

  TopicSubscriber

  以下是对这些接口的简单描述:

  ConnectionFactory:连接工厂,JMS 用它创建连接

  Connection:JMS 客户端到JMS Provider 的连接

  Destination:消息的目的地

  Session:一个发送或接收消息的线程

  MessageProducer: 由Session 对象创建的用来发送消息的对象

  MessageConsumer: 由Session 对象创建的用来接收消息的对象

  3.2.2 JMS消息模型

  JMS 消息由以下几部分组成:消息头,属性,消息体。

  l 消息头(header):JMS消息头包含了许多字段,它们是消息发送后由JMS提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。

  l 属性(property):由消息发送者产生,用来添加删除消息头以外的附加信息。

  l 消息体(body):由消息发送者产生,JMS中定义了5种消息体:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。

  3.3 JMS编程实践

  广义上说,一个JMS应用是几个JMS 客户端交换消息,开发JMS客户端应用由以下几步构成:

  1) 用JNDI 得到ConnectionFactory对象;

  2) 用JNDI 得到目标队列或主题对象,即Destination对象;

  3) 用ConnectionFactory创建Connection 对象;

  4) 用Connection对象创建一个或多个JMS Session;

  5) 用Session 和Destination 创建MessageProducer和MessageConsumer;

  6) 通知Connection 开始传递消息。

  3.3.1 消息生产者编程

  消息生产者程序如下:

  package org.jms.test;

  import java.io.*;

  import javax.jms.*;

  import javax.naming.*;

  public class Sender {

  public static void main(String[] args) {

  new Sender().send();

  }

  public void send() {

  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

  try {

  //Prompt for JNDI names

  System.out.println("Enter ConnectionFactory name:");

  String factoryName = reader.readLine();

  System.out.println("Enter Destination name:");

  String destinationName = reader.readLine();

  //Look up administered objects

  InitialContext initContext = new InitialContext();

  ConnectionFactory factory =

  (ConnectionFactory) initContext.lookup(factoryName);

  Destination destination = (Destination) initContext.lookup(destinationName);

  initContext.close();

  //Create JMS objects

  Connection connection = factory.createConnection();

  Session session =

  connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

  MessageProducer sender = session.createProducer(queue);

  //Send messages

  String messageText = null;

  while (true) {

  System.out.println("Enter message to send or 'quit':");

  messageText = reader.readLine();

  if ("quit".equals(messageText))

  break;

  TextMessage message = session.createTextMessage(messageText);

  sender.send(message);

  }

  //Exit

  System.out.println("Exiting...");

  reader.close();

  connection.close();

  System.out.println("Goodbye!");

  } catch (Exception e) {

  e.printStackTrace();

  System.exit(1);

  }

  }

  }

  3.3.2 消息消费者编程

  消息消费者程序如下:

  package compute;

  import java.io.*;

  import javax.jms.*;

  import javax.naming.*;

  public class Receiver implements MessageListener {

  private boolean stop = false;

  public static void main(String[] args) {

  new Receiver().receive();

  }

  public void receive() {

  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

  try {

  //Prompt for JNDI names

  System.out.println("Enter ConnectionFactory name:");

  String factoryName = reader.readLine();

  System.out.println("Enter Destination name:");

  String destinationName = reader.readLine();

  reader.close();

  //Look up administered objects

  InitialContext initContext = new InitialContext();

  ConnectionFactory factory =

  (ConnectionFactory) initContext.lookup(factoryName);

  Destination destination = (Destination) initContext.lookup(destinationName);

  initContext.close();

  //Create JMS objects

  Connection connection = factory.createConnection();

  Session session =

  connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

  MessageConsumer receiver = session.createConsumer(queue);

  receiver.setMessageListener(this);

  connection.start();

  //Wait for stop

  while (!stop) {

  Thread.sleep(1000);

  }

  //Exit

  System.out.println("Exiting...");

  connection.close();

  System.out.println("Goodbye!");

  } catch (Exception e) {

  e.printStackTrace();

  System.exit(1);

  }

  }

  public void onMessage(Message message) {

  try {

  String msgText = ((TextMessage) message).getText();

  System.out.println(msgText);

  if ("stop".equals(msgText))

  stop = true;

  } catch (JMSException e) {

  e.printStackTrace();

  stop = true;

  }

  }

  }

  以上程序都较为简单,基本上为自解释的。

  四、消息中间件总结

  消息中间件自从产生以来发展迅速,在分布式联机事务处理环境中,它担当通讯资源管理器(CRM)的角色,为分布式应用提供实时、高效、可靠的、跨越不同操作系统、不同网络的消息传递服务,同时消息中间件减少了开发跨平台应用程序的复杂性。在要求可靠传输的系统中可以利用消息中间件作为一个通讯平台,向应用提供可靠传输功能来传递消息和文件。

分享到:
评论

相关推荐

    消息中间件和JMS原理

    【消息中间件和JMS原理】是分布式系统中重要的组件,它们主要解决了传统RPC(Remote Procedure Call)中间件存在的性能、健壮性和可扩展性的不足。RPC中间件如CORBA、DCOM、RMI,虽然方便了跨网络的函数调用,但其...

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

    本压缩包文件“消息中间件和JMS消息服务.rar”可能包含了关于这两个主题的详细资料,旨在帮助读者深入理解其概念、工作原理以及实际应用。 消息中间件是一种软件,它允许应用程序之间通过消息进行通信,而不是直接...

    基于JMS的消息中间件的实现-论文.zip

    《基于JMS的消息中间件的实现》这篇论文深入探讨了如何在JMX(Java Management Extensions)分布管理框架下设计和实现一个JMS(Java Message Service)消息中间件。本文将详细解析这一主题,旨在理解其核心概念、...

    消息中间件与JMS.pdf

    ### 消息中间件与JMS详解 #### 摘要 随着企业信息化建设的深入,数据集成和系统整合的需求日益增长。为了更好地满足这些需求,消息中间件作为一种基于异步处理模型的技术,逐渐受到广泛关注。不同于传统的RPC(远程...

    java中间件之jms

    它的设计目的是为了定义一套标准接口,让Java应用程序能够与消息中间件进行交互,类似于JDBC在数据库访问方面的角色。值得注意的是,JMS本身并不实现消息服务,而是由具体的供应商(如ActiveMQ、IBM MQ等)来提供...

    从 0 开始带你成为消息中间件实战高手.rar

    我们将深入探讨消息中间件的核心概念、工作原理以及实际应用。 一、消息中间件基础 1. 概念理解:消息中间件是一种软件,它充当应用程序之间的中介,允许它们通过发送和接收消息进行通信,而无需直接连接。 2. 主要...

    分布式消息中间件实践_倪炜(著)

    通过阅读《分布式消息中间件实践_倪炜(著)》,读者将能够深入理解这四种消息中间件的内部原理、配置方法、使用技巧以及最佳实践,从而更好地应对分布式环境下的各种挑战。这本书是IT从业者提升专业技能、优化系统...

    TIBCO_RV__VS__IBM_MQ和JMS消息中间件的对比分析

    ### TIBCO Rendezvous (TIBCO RV) 与 IBM MQ 及 JMS 消息中间件的对比分析 #### TIBCO Rendezvous 技术简介 TIBCO Rendezvous(简称TIBCO RV)是一款强大的中间件产品,它通过一系列专有的技术,实现了异构系统...

    java实现的基于jms协议的消息队列中间件,源码!

    Java实现的基于JMS(Java Message Service)协议的消息队列中间件是一种用于应用程序间异步通信的重要技术。消息队列允许应用程序将消息发送到队列而不必等待接收方的响应,提高了系统的可扩展性和容错性。JMS是Java...

    Java消息中间件

    Java消息中间件(Java Message Middleware,JMM)是软件架构中一种重要的组件,它负责在分布式系统中处理、传输和存储消息。ActiveMQ是Java领域内广泛应用的消息中间件之一,以其开源、高性能、高可靠性和丰富的特性...

    JMS概念及原理,简明扼要

    ### JMS概念及原理简介 #### 一、JMS概述 Java消息服务(Java Message Service,简称JMS)是Java平台中的消息中间件规范,它允许应用程序组件通过异步通信来生产、发送、消费和接收消息。JMS提供了一种与具体实现...

    中间件技术与原理

    J2EE包含了一系列中间件服务,如Web容器、EJB容器、应用服务器等,提供了丰富的API和框架,如Servlet、JSP、JSF、JMS等,支持多层架构和分布式计算。 **分布式软件**是指由多个独立的组件跨越网络协同工作来完成一...

    基于PHP和Java的消息中间件的实现原理研究.zip

    Java作为企业级开发的首选语言,其在消息中间件领域有着丰富的实现,如ActiveMQ、RabbitMQ Java客户端、Apache Kafka以及JMS(Java Message Service)规范。Java开发者可以使用JMS API来与各种消息中间件提供商进行...

    实验三 消息中间件应用开发:ActiveMQ实现单线程多队列

    在该实验中,我们将深入理解消息中间件的基本概念,特别是ActiveMQ的工作原理和使用方法。首先,我们需要了解ActiveMQ的核心特性,如点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)模型,这两种模式是...

    基于消息中间件的学习记录以及源码示例【JMS、AMQP、ActiveMQ、RocketMQ】.zip

    本文将深入探讨基于消息中间件的学习记录,包括Java消息服务(JMS)、先进消息队列协议(AMQP)以及两个流行的开源实现:ActiveMQ和RocketMQ。 首先,Java消息服务(JMS)是一种标准API,用于在Java应用程序之间...

    ActiveMQ消息中间件面试专题.pdf

    Apache ActiveMQ是一个开源的消息中间件,它属于Apache软件基金会。...通过这些知识点,我们可以更好地理解ActiveMQ的工作原理及其在不同场景下的应用和配置策略,为进行消息中间件面试或实际应用提供有价值的参考。

Global site tag (gtag.js) - Google Analytics