基于JMX框架的JMS消息中间件设计

时间:2022-09-22 01:26:00

基于JMX框架的JMS消息中间件设计

摘 要:消息中间件为应用系统之间提供了可靠、高效、跨平台的消息传递服务,有利于应用之间的数据交换。但消息中间件在具体实现上有很大的差异,不同的厂商采用各自的开发标准和接口,因而不同系统之间兼容性不好,这样不利于降低企业的成本,同时也加重了应用开发者和系统维护的负担。基于以上目的设计了一个遵从JMS规范的基于JMX技术的消息中间件。首先介绍了与消息中间件相关的概念和模型;其次,对Sun公司提出的JMS API接口规范进行分析,解决了JMS实现的关键问题,并且将JMX技术引入到消息中间件的管理中,提出了JMS消息中间件的设计和实现思路。

关键词:消息中间件;JMS;JMS实现;JMX;XMB

0 引言

在分布式应用中,CORBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:①同步通信:客户端发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;②客户端和服务对象的生命周期紧密耦合:客户端进程和服务对象进程都必须正常运行,如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户端会接收到异常;③点对点通信:客户端的一次调用只发送给某个单独的目标对象。

面向消息的中间件(Message Oriented Middleware,MOM)较好地解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信:对于一个消息可以有多个接收者。在此背景下,本文设计了基于JMX框架的JMS服务器 (下文称为JMX-oriented Message Bus Server,简称为XMB服务器)系统。XMB是一个遵从JMS1.1规范的基于JMX管理框架的消息中间件实现。该中间件从逻辑上分为两大部分:一部分是客户端编程接口;另一部分则实现一个基于JMS规范的消息中间件服务器。

1 JMS规范解析

Java消息服务(Java Message Service,JMS)是J2EE(Java 2 Enterprise Edition)套件的一部分,它提供了标准API,Java开发人员可以使用这些API来访问企业消息系统的共同特性。Java消息服务定义了Java中访问消息中间件的接口。JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMS实现(JMS Provider)。JMS支持/订阅和点对点模型,并允许创建由任意Java对象组成的消息类型。

1.1 JMS体系结构

一个完整的JMS应用程序是由以下部分组成的:JMS实现(JMS provider),它是一个实现了JMS接口并提供管理和控制能力的消息通信系统;JMS客户端是使用Java编程语言编写的创建和消费消息的程序或组件;消息是在JMS客户之间用于交流信息的对象;受管对象(Administered object)是由管理员为客户使用而创建的预先设置JMS对象(preconfigured JMS object)。主要有两个受管对象:目的域(destination)和连接工厂(connection factory)。

图1展示了上述对象的交互情况。管理员利用管理工具绑定目的域和连接工厂到JNDI(Java Naming and Directory Interface)命名空间。然后,JMS客户就能够查找该命名空间内的受管对象,而后通过JMS实现建立一个到这些对象的逻辑连接。

1.2 消息通信模式

JMS规范定义了两种消息通信模式:点对点(PointtoPoint,PTP)通信模式和者/订阅者(Pub/Sub)通信模式。

PTP(PointtoPoint)模型是基于队列的,发送方发消息到队列(Queue),接收方从队列接收消息,队列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱一样,队列可以包含各种消息,JMS Provider提供工具管理队列的创建、删除。JMS PTP模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息。

JMS Pub/Sub模型定义了如何向一个内容节点和订阅消息,这些节点被称作主题(topic)。主题可以被认为是消息的传输中介,者(publisher)消息到主题,订阅者(subscribe)从主题订阅消息。主题使得消息订阅者和消息者保持互相独立,不需要接触即可保证消息的传送。

2 JMS关键技术

2.1 XMB的体系结构

如图2所示,整个XMB系统主要由4个部分组成:JMS实现、JNDI实现、XMB管理框架和XMB API。

其中,JMS实现模块是保证消息传输的关键模块,是整个系统的核心之一,也是本文主要描述和设计的系统模块。该模块由JMS接口实现和对象传输层组成。JMS接口实现主要是用来和外部系统交互,对象传输层主要负责服务器端和客户端交互所必需的通讯工作。这里的XMB API就是前面JMS接口实现策略中提到的,为JMS接口实现提供访问系统中更基础功能的系统内部自己定义的一层外观(Faade)。

JNDI实现并不属于JMS规范的内容,而是作为J2EE规范的一部分,为其它的J2EE模块提供命名和目录服务,提供发现和定位功能的一个技术规范。在XMB系统中,JNDI扮演了一个很重要的角色,它提供了一个接口让用户在不知道资源所在位置的情形下,取得该资源服务。另外,服务器还要对客户端所需的通讯对象进行管理,对于如何管理JMS规范没有统一的规定,但是JMX作为SUN推出的分布式环境组件对象管理的标准,很适合解决服务器端受管对象的管理。因此,XMB管理框架采用JMX技术为基础,为JMS模块提供扩展管理架构,用于对服务器端受管对象的管理。

2.2 消息队列设计

消息队列是一个消息中间件的核心部件,它的设计是左右一个JMS服务器效能的关键。

从应用的层面上讲,消息队列是消息的安全存放地,队列需要存储消息直到消息被应用程序处理为止。消息队列通常是以下述方式进行工作的:①程序A形成对消息队列系统的调用,此调用告知消息队列系统,消息准备好了投向程序B;②消息队列系统发送此消息到程序B驻留处的系统,并将它放到程序B的队列中;③适当时间后,程序B从它的队列中读此消息,并处理此信息。

消息队列必须要能够在各种网络条件下保证消息的可靠传递,必须要克服网络线路质量差或不稳定的现状。在传输过程中,如果通信线路出现故障或远端的主机发生故障,本地的应用程序都不会受到影响,可以继续发送数据,而无需等待网络故障恢复或远端主机正常后再重新运行。

一般在消息中间件中不会只有一种类型的队列。消息中间件的队列分为很多种类型,其中包括:本地队列、远程队列、模板队列、动态队列、别名队列等。

本地队列又分为普通本地队列和传输队列,普通本地队列是应用程序通过API对其进行读写操作的队列;传输队列可以理解为存储――转发队列,比如:系统将某个消息交给JMS系统发送到远程主机,而此时网络发生故障,JMS系统将把消息放在传输队列中暂存,当网络恢复时,再发往远端目的地。

远程队列是目的队列在本地的定义,它类似一个地址指针,指向远程主机上的某个目的队列,它仅仅是个定义,并不真正占用磁盘存储空间。

模板队列和动态队列不是必须的,但是很多商业消息中间件产品都实现了它们。它们的一个典型用途是用作系统的可扩展性考虑。基于以上考虑,可以在XMB系统中创建一个模板队列,当今后需要新增队列时,每打开一个模板队列,JMS系统便会自动生成一个动态队列,还可以指定该动态队列为临时队列或者是永久队列,若为临时队列可在关闭它的同时将它删除,相反,若为永久队列,可以将它永久保留,以后继续用。

借用观察者模式的框架,可以得到如图3所示的消息队列体系结构。

从图3中可以看到:首先,系统定义了一个抽象类IMessagingQueue,它相当于观察者模式中的Subject接口,负责消息队列的基类型,这样的实现是为了便于系统在今后加入其它类型的消息队列时不至于进行整个框架的改变。IMessagingQueue定义了所有消息队列的公共属性和方法。ClientList是一个双向链表,它维持了一个注册到该消息队列的客户队列,attach( )和detach( )用于客户注册或取消注册的方法。当服务器收到新的消息后会调用notify( )方法,在notify( )方法中会调用客户的getMessage( )方法将消息的一个复本push到客户端。

然后,系统定义一个IMessagingClient接口,用于表示连接到某个消息队列的客户。该接口只有一个方法,就是getMessage( ),并且该方法是一个push方法,客户是被动的。此外,客户有一个重要的属性――onlineState,消息队列要凭该属性的值判断客户的在线状态,以决定是发送消息还是缓存消息。最后,还必须明确消息队列是在JMS系统启动时由JMS系统的相关部件创建的。

2.3 管理框架设计

关于整个服务器对象的管理在JMS规范中并未做具体的规定,但是该部分对于整个系统来说却是很重要的。消息服务器管理框架的实现不仅会影响JMS实现各部分的性能和效率,而且对于消息的监控以及整个系统的可操作性来说也同样重要。该部分主要负责管理系统中已经建立的JMS受控对象,即Queue和Topic的创建、管理和销毁,以及这些对象中的持久消息和持久订阅对象等。

为了更好的完成服务器对象的管理,本系统采用了Sun公司的另一个重要的Java技术――JMX,它主要用于分布式系统中的对象管理。JMX实现是在系统启动时自启动的,和它交互的边界主要是OTL层。

在整个系统中,XMBServerAgent可以看作是管理框架的大脑,和注册到其中的各种MBean共同组成了整个JMX管理框架。

图4是整个管理框架的实现,系统首先定义了4种MBean,然后完成了它们各自的实现类。这些MBean都会到XMBServerAgent中的MBeanServer去注册,同时它们也在被销毁的时候撤销注册。然后,系统管理员就可以通过表示HTML控制台的MBeanHtmlAdaptorServer来界面化操作这些服务器。这些不同的服务器的操作已经定义在了各自的MBean接口中,而这些MBean接口又可以嵌套使用。

3 结束语

本文针对分布式应用通信中存在的问题,讨论了消息中间件设计的关键技术和系统框架,并借鉴如JBoss messaging,OpenJMS等优秀的开源消息中间件的设计思想,设计了基于JMX框架的JMS服务器――XMB。整个XMB由两部分组成:客户端JAR文件和XMB服务器。客户端JAR文件用于客户加入ClassPath中进行JMS客户端开发。XMB服务器用于创建、部署和管理消息目的域,并提供基于消息通讯的低层系统支持。参考文献:

\[1\] ERIC NEWCOMER, GREG LOMOW. Understanding SOA with web services中文版\[M\].徐涵,译.2006.

\[2\] KIM HAASE. JavaTM message service API tutorial\[M\]. Sun Microsystems,Inc,2002.

\[3\] DAVID REILLY. Java网络编程与分布式计算\[M\].沈风,译.北京:机械工业出版社,2003.

\[4\] What is middleware\[EB/OL\]. .

\[5\] Message oriented middleware vendor lists\[EB/OL\]. .

\[6\] JFoxMQ maven\[EB/OL\]. www.省略/jfox/jfoxmq/maven.

上一篇:一种快速需求分析方法 下一篇:基于GPRS的智能路灯Web监控系统的设计与实现