构件运行支撑平台接入消息服务的方法

文档序号:6609720阅读:174来源:国知局
专利名称:构件运行支撑平台接入消息服务的方法
技术领域
本发明属于软件技术领域,尤其涉及一种在构件运行支撑平台中接入消息服务的方法。
背景技术
随着Internet技术的发展,软件系统的复杂性不断增加、软件人员的频繁流动和软件行业的激烈竞争迫使软件企业必须不断提高软件质量,尽可能地缩短软件开发周期。于是集软件复用、分布式计算、企业级应用开发等技术为一体的“基于构件的软件开发”(CBSD,ComponentBased Software Development)应运而生。国内外对于这一技术的研究正在不断深入,国际大型的软件公司(例如Sun,Microsoft)及对象管理组织(OMG)都推出了支持构件技术的软件运行和管理平台-即构件运行支撑平台。
J2EE(Java 2 Platform Enterprise Edition)平台和.NET平台是目前最为成熟也是应用最广泛的两种构件运行支撑平台,它们提供了安全服务、事务服务、消息服务等标准服务。其中消息服务是构件运行支撑平台中一种非常重要的服务,它支持异步的消息传递和方法调用,可以提高应用系统的吞吐量和并行能力,从而提高它的性能和灵活性。随着人们对应用的服务质量的要求越来越高,应用规模越来越大并不断向动态开放的Internet拓展,异步方式逐渐成为一种常用的通信方式,消息服务的重要性不断凸显。
因为构件运行支撑平台的复杂性,其开发者通常采用集成一个消息中间件的方式来提供消息服务。目前,很多开源组织和企业都开发了自己的消息中间件产品,开源产品有ObjectWeb的JORAM、Apache的ActiveMQ、Exolab的OpenJMS等,企业级产品有IBM的MQSeries、BEA的MessageQ、Microsoft的MSMQ等。
这些成熟的消息中间件产品使得构件运行支撑平台开发者无需重新开发全新的消息服务,只需集成即可。但是这种集成方式往往是紧耦合的,即构件运行支撑平台和特定消息中间件产品捆绑在一起,平台中只存在唯一的消息中间件产品、唯一的消息服务。在这种紧耦合的方式中,构件运行支撑平台的管理模块直接使用消息中间件产品特定的应用编程接口来管理息中间件产品,通过封装或组合应用编程接口来提供消息服务,这样需要在构件运行支撑平台管理模块的代码中嵌入消息中间件产品特定的应用编程接口的代码。例如国际知名开源软件JBOSS(构件运行支撑平台)和JBossMQ(一种消息中间件产品)的集成,JOnAS(构件运行支撑平台)和JORAM(一种消息中间件产品)的集成。这种紧耦合的集成方式存在很大的问题。随着软件技术的发展,更加成熟的、成本更加低廉的消息中间件产品不断出现,原来的消息中间件随着时间的推移也会不断推出新版本,这时候需要考虑在构件运行支撑平台中引入新的消息中间件产品或者消息中间件产品的新版本,而紧耦合集成方式会带来很大的负担,需要删去原构件运行支撑平台对一种消息中间件产品的绑定,重新绑定新的消息中间件产品,这就需要修改构件运行支撑平台管理模块的代码,需要封装新的消息中间件产品的应用编程接口以提新的供消息服务。
不仅如此,构件运行支撑平台需要支持的应用越来越复杂,需求也千变万化,如何满足不同应用关于消息服务的不同的需求(可能需要多个消息服务同时存在),以及运行时刻动态扩展(可能需要运行时刻引入新的消息服务),是构件运行支撑平台接入消息服务的一个新的挑战。

发明内容
本发明的目的是提供一种简单易用的、灵活性高的、易于扩展的消息服务接入方法,可以在构件运行支撑平台中以松耦合的方式接入第三方消息中间件产品,以提供消息服务。
本发明的另一目的还在于提供一种在构件运行支撑平台中动态接入第三方消息中间件产品的方法。
本发明的构件运行支撑平台中接入消息服务的方法,其步骤包括1.根据构件运行支撑平台设定该平台所需消息服务的功能;2.根据上述功能设定消息中间件所需提供的功能;3.将上述消息中间件所需提供的每一功能用一方法表示;4.将上述方法封装在一接口中,此接口作为不同连接适配器面向构件运行支撑平台的统一接口;5.在各消息中间件中选定能够提供上述相应功能的一个或多个方法,进行封装或组合,为各消息中间件实现包含4)所述统一接口的各消息中间件连接适配器;6.构件运行支撑平台管理模块根据统一接口编写消息服务的实现类;7.构件运行支撑平台管理模块编写启动消息服务的代码;8.上述启动指定消息服务的代码运行时,由消息服务的实现类调用指定的消息中间件连接适配器;9.通过该消息中间件连接适配器启动该消息中间件,接入指定的消息服务。
上述消息中间件所需提供的功能为消息目的地的创建方法和删除方法,连接工厂的创建方法和删除方法,消息中间件的启动方法和关闭方法所表示的功能。
所述消息目的地的创建方法包括队列型消息目的地的创建方法和主题型消息目的地的创建方法;所述连接工厂的创建方法包括队列型连接工厂的创建方法和主题型连接工厂的创建方法。
所述各消息中间件连接适配器中消息中间件的启动方法包含消息中间件的启动逻辑,按照具体消息中间件产品的要求来编写;该方法被调用时,通过其方法参数读入消息中间件的通用配置信息;通过设置的环境变量中包含的配置文件的路径和名字读入配置文件中包含的特定配置信息,启动该消息中间件。
所述各消息中间件连接适配器中消息中间件的关闭方法被调用时,按照消息中间件的关闭步骤关闭消息中间件。
在关闭过程中把消息中间件中需要持久保存的信息写入持久存储器,释放已分配的资源。
所述各消息中间件连接适配器中队列型消息目的地的创建方法和主题型消息目的地的创建方法的方法参数为消息目的地的名字;该连接适配器中配置一个消息目的地列表,列表项是已经创建的消息目的地,当这两方法被调用时,先判断给定名字的消息目的地是否在列表中存在,如果存在则直接返回该消息目的地,如果不存在则创建一个这个名字的消息目的地,并把它放到列表中,然后返回这个消息目的地;如果已经存在的消息目的地和需要创建的消息目的地有相同的名字但是类型不同,创建消息目的地失败,打印出错信息。
所述各消息中间件连接适配器中消息目的地的删除方法被调用时,该方法关闭指定的消息目的地,并把消息目的地从消息目的地列表中删除。
所述各消息中间件连接适配器中队列型连接工厂的创建方法和主题型连接工厂的创建方法具有统一的接口,该被调用时分别创建到消息中间件的队列类型和主题类型的连接;该连接适配器配置一个连接工厂列表,当需要创建新的连接工厂时首先检查该列表,如果指定名字的连接工厂已经存在并且类型和需要创建的连接工厂的类型一致,则直接从列表中取出这个连接工厂返回给方法调用者;如果列表中存在与需要创建的连接工厂同名但是类型不同的连接工厂则创建连接工厂失败,打印错误信息。
所述各消息中间件连接适配器中连接工厂的删除方法被调用时,该方法关闭指定的连接工厂,并把连接工厂从列表中删除,如这样的连接工厂不存在,则什么也不做。
将消息中间件连接适配器代码和该消息中间件运行所需代码编译为库文件,提供给构件运行支撑平台。
构件运行支撑平台通过动态加载机制在运行时刻动态获得上述库文件。
构件运行支撑平台管理模块设有一配置文件,配置文件中可添加记录,每一条记录代表一个消息服务;每条记录由两部分组成,第一部分指明消息服务的实现类,第二部分指明消息服务实现类要使用的消息中间件连接适配器名称和所在位置;构件运行支撑平台需要提供消息服务时就在配置文件中添加一条记录,构件运行支撑平台根据新添加的记录启动新添加的消息服务。
本发明包含两方面内容一是不同的消息中间件实现与构件运行支撑平台的统一适配方法;二是使用统一适配方法实现运行时刻构件运行支撑平台动态接入消息服务的机制。
一、不同的消息中间件实现与构件运行支撑平台的统一适配方法。
目前业界尚未对消息中间件向外提供的接口制定统一的标准,因而,不同厂商提供的消息中间件有各自不同的应用编程接口。消息中间件的应用编程接口通常由多个方法(方法是面向对象编程语言中的术语,是实现一定功能的程序代码)组成,通过调用这些方法,外界可以对消息中间件进行管理并且使用消息中间件提供的功能。不同消息消息中间件产品的应用编程接口在方法的名称、数量、调用顺序上是不同的。为了屏蔽不同消息中间件应用编程接口的差异性,从而让构件运行支撑平台能够方便地兼容不同厂商的消息中间件,本发明在在构件运行支撑平台和消息中间件之间建立一层连接机制,即连接适配器。适配器作为一个桥接,一方面对构件运行支撑平台提供统一的接口,另一方面通过不同的接口实现连接到不同的消息中间件。
图1描述了这种适配方法,其中“SPI”(服务提供者接口Service Provider Interface,简称为SPI)表示连接适配器对构件运行支撑平台提供的统一接口,“SPI实现”表示不同的消息中间件面向统一接口的不同实现。
所述服务提供者接口SPI是外界访问连接适配器的窗口,它由一组方法组成。如下所示为由一组方法组成的服务提供者接口,构件运行支撑平台通过调用这些方法来使用连接适配器提供的功能服务提供者接口SPI{start();//启动消息中间件stop();//停止消息中间件createQueue();//在消息间件中创建队列型的消息目的地createTopic();//在消息中间件中创建主题型的消息目的地deleteDestination();//删除消息目的地createQueueConnectionFactory();//创建队列型的连接工厂createTopicConnectionFactory();//创建主题型的连接工厂deleteConnectionFactory();//删除连接工厂}SPI描述了连接适配器应该提供的功能,需要通过封装或组合消息中间件的应用编程接口来实现。前文所述的“SPI实现”就是指使用不同的消息中间件的应用编程接口来实现的包含SPI的各消息中间件连接适配器,每个连接适配器连接到一个消息中间件,不同的消息中间件的连接适配器是不相同的,但是不同的连接适配器均包含了对构件运行支撑平台提供的统一接口SPI。这样,构件运行支撑平台能够使用相同的代码以完全一致的方式来使用不同的连接适配器,进而连接到连接适配器对应的消息中间件产品。
这部分工作可以分成以下两个步骤1、根据构件运行支撑平台对消息中间件的功能需求和消息中间件提供的功能定义服务提供者接口SPI;2、为不同的消息中间件实现服务提供者接口SPI。
所述消息服务的需求是指通过集成消息中间件来提供消息服务时,消息服务的功能最终将映射成消息中间件的功能,需要消息中间件能够提供消息目的地的创建和删除,连接工厂的创建和删除,消息中间件的启动和关闭等基本功能。
所述消息中间件提供的功能是指不同消息中间件都会提供的具有共性的功能。一般的消息中间件都会提供上面那些基本功能(消息目的地的创建和删除,连接工厂的创建,消息中间件的启动和关闭),如果一个消息中间件不提供这些构件运行支撑平台所需的基本功能,则不在构件运行平台的考虑之列。
本发明所述的SPI就可以由下述方法所组成消息目的地的创建方法和删除方法,连接工厂的创建方法和删除方法,消息中间件的启动方法(start方法)和关闭方法(stop方法)。
虽然在紧耦合方式中也有这些方法提供的功能,但是并没有把提供这些功能的代码聚集起来以方法的形式放在一个统一的接口中,而是分散在构件运行支撑平台代码中。
对start方法和stop方法的说明。它们是消息中间件的启动方法和关闭方法。要使用消息中间件提供的功能,必须先启动消息中间件并进行初始化,这就是start方法功能;当构件运行支撑平台关闭或者不再需要某个消息中间件提供的服务时,需要停止该消息中间件并回收已分配的资源,这项功能由stop方法来提供。
所述初始化是指为了使消息中间件能够正确运行,必须对它进行一些初始的配置,包括分配存储资源、加载运行参数等,这需要使用消息中间件产品的应用编程接口来实现。
所述回收已分配的资源是指回收在初始化过程中为消息中间件分配的各种资源,这需要使用消息中间件产品的应用编程接口来实现。
对createQueue方法(队列型消息目的地的创建方法)和createTopic方法(主题型消息目的地的创建方法)的说明。它们是消息目的地的创建方法。一般来讲,消息服务中有两类消息目的地队列型消息目的地(Queue)和主题型消息目的地(Topic)。这两类消息目的地的区别是发送到队列型消息目的地的每一条消息只会被一个消息消费者收到(即使有多个消息消费者在监听同一个消息目的地),发送到主题型消息目的地的每一条消息会被正在监听此消息目的地的所有消费者收到。队列型的消息目的地通常用于点对点(Point-to-Point,一个消息发送者对应一个消息消费者)的通信模式,而主题型的消息目的地一般用于发布-订阅(Pub-Sub,一个消息发布者对应到多个消息订阅者)的通信模式。createQueue和createTopic就是用于在消息中间件中创建这两种类型的消息目的地的方法,它们以要创建的消息目的地的名字作为参数,这个名字能够唯一标识一个消息目的地,以后通过这个名字来访问消息目的地。
对deleteDestination方法(消息目的地的删除方法)的说明。此方法用来删除已建立的消息目的地,它以要删除的消息目的地的名字作为参数,因为消息目的地的名字可以唯一确定一个消息目的地,故不用区分要删除的消息目的地的类型。
对createQueueConnectionFactory方法(队列型连接工厂的创建方法)和createTopicConnectionFactory方法(主题型连接工厂的创建方法)的说明。它们是连接工厂的创建方法。应用程序在发送和接收消息之前需要创建到消息中间件的连接,而到消息中间件的连接需要由消息中间件提供的连接工厂来创建。与两种类型的消息目的地对应,需要提供两种类型的连接工厂队列型的连接工厂和主题型的连接工厂。createQueueConnectionFactory方法和createTopicConnectionFactory方法就是用来创建这两种类型的连接工厂,它们以需要创建的连接工厂的名字作为参数,名字能够唯一标识一个连接工厂,以后通过名字来访问连接工厂。
对deleteConnectionFactory方法(连接工厂的删除方法)的说明。与删除消息目的地的deleteDestination方法类似,deleteConnectionFactory以连接工厂的名字作为参数,用于删除不再需要的连接工厂。
根据构件运行支撑平台对消息中间件的功能需求和消息中间件提供的功能定义服务提供者接口SPI的工作可以划分为下面几个步骤1.根据构件运行支撑平台的需要确定消息服务的功能(比如消息目的地的创建和删除,连接工厂的创建等);2.确定消息中间件必须提供的功能第1步中消息服务的功能再加上消息中间件的启动和关闭等管理功能就是消息中间件必须提供的功能;3.把第2步中的每个功能用一个方法来表示,方法名用有意义的词,最好能反映方法提供的功能;4.最后将第3步中得到的方法放在一个统一的接口中形成SPI接口。
这样就定义了统一的服务提供者接口SPI,只要为不同的消息中间件实现这里定义的服务提供者接口,它们就能被方便地被构件运行支撑平台集成以实现消息服务。
下面为不同消息中间件实现统一的服务提供者接口SPI,有了不同消息中间件的上述SPI实现,构件运行支撑平台就能够方便的使用不同的消息中间件。
start方法中包含消息中间件的启动逻辑(需要使用消息中间件的配置信息),它按照具体消息中间件产品的要求来编写。消息中间件的配置信息可以通过方法参数和环境变量两种方式进行设定start方法通过其方法参数读入消息中间件的通用配置信息;通过设置的环境变量中包含的配置文件的路径和名字读入配置文件中包含的特定配置信息。在得到这些配置信息之后,start方法就可以根据消息中间件特定的启动方式启动消息中间件并进行初始化。不同的消息中间件有不同的启动流程和初始化方法,需要参考消息中间件的使用手册。
stop方法按照消息中间件的关闭步骤关闭消息中间件。其中需要把消息中间件中需要持久保存的信息写入持久存储器,释放已分配的资源。
createQueue方法和createTopic方法用来在消息中间件中创建队列类型和主题类型的消息目的地,方法参数是消息目的地的名字。SPI实现需要维护一个列表,列表项是已经创建的消息目的地,当这两个方法被调用时,它们先判断给定名字的消息目的地是否在列表中存在,如果存在则直接返回该消息目的地,如果不存在则创建一个这个名字的消息目的地,并把它放到列表中,然后返回这个消息目的地。如果已经存在的消息目的地和需要创建的消息目的地有相同的名字但是类型不同(比如要求创建一个名为myqueue的队列类型的消息目的地,但是已经存在一个名为myqueue的主题类型的消息目的地),这时创建消息目的地失败,打印出错信息。当deleteDestination被调用时,它关闭指定的消息目的地,并把消息目的地从消息目的地列表中删除,如这样的消息目的地不存在,则什么也不做。
createQueueConnectionFactory方法和createTopicConnectionFactory方法用于创建队列类型和主题类型的连接工厂,这两类连接工厂具有统一的接口,它用于创建到消息中间件的队列类型和主题类型的连接。SPI实现也会维护一个连接工厂的列表,当需要创建新的连接工厂时首先检查该列表,如果指定名字的连接工厂已经存在并且类型和需要创建的连接工厂的类型一致,则直接从列表中取出这个连接工厂返回给方法调用者;如果列表中存在与需要创建的连接工厂同名但是类型不同的连接工厂则创建连接工厂失败,打印错误信息。deleteConnectionFactory被调用时,它关闭指定的连接工厂,并把连接工厂从列表中删除,如这样的连接工厂地不存在,则什么也不做。
这部分工作可细分为下面几个步骤1.根据SPI接口确定能够被构件运行支撑平台使用的消息中间件,只有提供了SPI中的方法指定的功能的消息中间件才能被构件运行支撑平台使用;2.SPI中每个方法代表消息中间件必须提供的一项功能,在消息中间件中找出提供此项功能的一个或多个方法;3.编写SPI实现通过封装或组合第2步中为SPI中的每个方法找出的消息中间件的一个或多个方法来实现SPI中的每个方法。
这样,就为特定的消息中间件编写了实现了统一的服务提供者接口的SPI实现,构件运行支撑平台可以通过这个SPI实现访问对应的消息中间件。
二、使用统一适配方法实现运行时刻构件运行支撑平台动态接入消息服务的机制。
下面使用前面提出的不同消息中间件实现与构件运行支撑平台的统一适配方法来实现运行时刻构件运行支撑平台动态接入消息服务的机制。
这部分工作可以分为以下几个步骤1、根据连接适配器的统一接口编写构件运行支撑平台的消息服务的实现类;2、选定所需的消息中间件的连接适配器和消息中间件;3、编写构件运行支撑平台消息服务配置文件;4、创建消息服务类的实例、启动消息服务中间件。
所述消息服务的实现类是指构件运行平台中用来实现消息服务的程序代码,通常是面向对象语言中的一个或多个类,这些类使用消息中间件的连接适配器(即SPI实现)访问消息中间件。
所述编写构件运行支撑平台消息服务配置文件是指在配置文件中说明消息服务的实现类和要使用的SPI实现,可以配置多个消息服务。
所述创建消息服务类的实例是指根据3中创建的消息服务配置文件创建消息服务实现类在内存中的对象,这些对象是消息服务的运行实体。
下面先说明第一个步骤——编写构件运行支撑平台的消息服务的实现类。消息服务是构件运行支撑平台的一项基本服务,消息服务的实现是构件运行支撑平台实现工作的一部分。因而,开发构件运行支撑平台的一项任务就是使用前面定义的服务提供者接口来开发平台中的消息服务实现类,实现类只通过前面定义的SPI接口调用连接适配器,从而使用消息中间件提供的功能。这样消息服务只依赖于SPI接口,不同的SPI实现都能被消息服务使用。消息服务的具体实现和构件运行支撑平台的实现紧密相关,但最终表现形式主要是用某种程序设计语言编写的程序代码。消息服务的实现代码通常会有下面的方法start、stop、createQueue、createTopic、createQueueConnectionFactory、createTopicConnectionFactory等。start方法通常需要指定消息中间件连接适配器的信息,该信息可在构件运行支撑平台运行时从方法参数或者运行时环境中动态获取,运行时start方法使用程序设计语言中提供的动态加载方法启动指定的消息中间件连接适配器,从而启动消息中间件。消息服务实现代码的其它几个方法内部调用连接适配器中对应的方法来提供消息服务所需要的功能。构件运行支撑平台的管理模块通过程序设计语言提供的动态加载机制动态启动消息服务的代码。构件运行支撑平台只需要开发一份消息服务的程序代码,运行时创建消息服务程序代码的多个实例,每个实例连接一个消息中间件,这样就能提供多个不同的消息服务。这部分工作实际包含下面几个步骤
1)编写消息服务实现类,实现类通过前面定义的SPI来管理消息中间件并使用消息中间件提供的功能;2)在构件运行支撑平台管理模块中编写启动指定的消息服务的代码;3)运行时根据需要启动1)中消息服务实现类的多个实例,每个实例代表一个消息服务,它通过连接适配器连接到一个具体的消息中间件。
从前文可以看出,对具体消息中间件的访问代码被封装在消息中间件连接适配器中,构件运行支撑平台的消息服务内部使用消息中间件连接适配器来访问消息中间件,最直接的方法是把消息中间件连接适配器的程序代码作为构件运行支撑平台程序代码的一部分嵌在其中。这样做的后果是,构件运行支撑平台在代码编译阶段就会通过消息中间件连接适配器间接依赖于消息中间件,这就要求消息中间件必须先于构件运行支撑平台而存在,很难在平台运行时动态引入新的消息中间件,从而很难动态接入新的消息服务。
为了方便动态引入新的消息中间件,本发明消除了代码级的依赖,把消息中间件连接适配器的代码从构件运行支撑平台的代码中剥离出来,让构件运行支撑平台的代码可以单独编译。这就是第二个步骤需要做的事情——准备连接适配器和消息中间件。按照“不同的消息中间件实现与构件运行支撑平台的统一适配方法”中描述的方法,为构件运行平台需要使用的消息中间件编写该消息中间件的连接适配器,然后把该消息中间件连接适配器的程序代码编译成库文件,最后把该消息中间件连接适配器的库文件以及该消息中间件运行需要的库文件一起提供给构件运行支撑平台,供平台动态启动消息服务使用。
下面进行第三个步骤——编写构件运行支撑平台消息服务配置文件。配置文件中有多条记录,每一条记录代表一个消息服务。每条记录由两部分组成,第一部分指明消息服务的实现类,第二部分指明消息服务实现类要使用的连接适配器名称和所在位置。最初配置文件中没有记录,构件运行支撑平台中没有消息服务;当需要提供消息服务时就在配置文件中添加一条记录,构件运行支撑平台根据新添加的记录动态启动新添加的消息服务。
第四步是创建消息服务类的实例、启动消息服务中间件。第一步中在构件运行支撑平台的代码中加入了动态启动消息服务的代码,当消息服务配置文件中加入新的记录时,构件运行支撑平台自动取出该条记录,找到相应的连接适配器,通过程序设计语言提供的动态加载机制动态启动消息服务。这样,平台通过动态装载机制就能自动启动新引入的消息服务,而不需要对平台本身做出修改,提高了平台的灵活性和扩展性。
完成这些步骤,可以在构件运行支撑平台中动态引入新的消息服务。当构件运行支撑平台中原有的消息服务不能满足需求时,可以根据需求选择一个合适的消息中间件,并为它编写该消息中间件的连接适配器,然后修改消息服务配置文件,构件运行支撑平台自动启动新引入新的消息服务。
采用本发明提供的方法,可以在不对构件运行支撑平台本身做出修改的前提下,通过编写消息中间件连接适配器和修改配置文件的方法方便灵活地为平台动态接入新的消息服务。应用可以在部署时刻选择适合自己的消息服务,甚至在其运行时刻也可以对消息服务进行动态选择。在对应用系统的服务质量要求越来越高的今天,这对于基于构件的大型应用系统的开发、集成、演化具有十分重要的意义。另一方面,同样的连接适配器也可能在不同的构件运行支撑平台上进行复用,这就提高了构件运行支撑平台的开发效率,降低平台的开发成本。
本发明在保持平台系统正常运行的情况下,用户可以根据业务需求选择不同的消息服务。对于平台开发者而言,他使用统一的接口对消息服务进行管理,不需要关心消息中间件产品的具体实现;而对于平台的使用者,他们可以动态选择满足业务需求的消息服务,可以使用个别消息中间件产品特有的功能。


图1是消息服务动态接入方法示意图;实施例以下结合具体的构件运行支撑运行平台,描述在构件运行平台中的多消息接入方法的实施。
本节以一个J2EE构件运行支撑平台—北大艾斯应用服务器(Peking UniversityApplication Server)为例,阐述如何使用该方法在构件运行支撑平台中动态接入消息服务。消息中间件使用JORAM、ActiveMQ以及SonicMQ。
使用前文描述的方法在北大艾斯应用服务器中动态接入消息服务的步骤如下北大艾斯应用服务器的消息服务实现类用Java语言编写,主要是JMSService这个类。北大艾斯应用服务器定义的消息服务的服务提供者接口如下public interface JMSProviderAdapter{public void start(boolean isMOMEmbeded,String url)throws Exception;public void stop();public Queue createQueue(String name)throws Exception ;public Topic createTopic(String name)throws Exception;public void deleteDestination(String name)throws Exception;public QueueConnectionFactory createQueueConnectionFactory();public TopicConnectionFactory createTopicConnectionFactory();public void deleteConnectionFactory();}
JMSProviderAdapter中定义了消息中间件生命周期管理(start方法和stop方法)和消息目的地的创建与删除,以及连接工厂的创建与删除等方法。JORAM、ActiveMQ、SonicMQ这三个消息中间件产品的连接适配器分由实现JMSProviderAdapter接口的三个类来实现,它们是JORAMAdapter、ActiveMQAdapter和SonicMQAdapter。
为了能够动态地在北大艾斯应用服务器中接入消息服务,我们将这三个消息中间件产品的连接适配器代码从北大艾斯应用服务器的代码中独立出来,并单独编译打包成三个jar文件,只要服务提供者接口和消息中间件产品本身不变,这些连接适配器就不需要变化。然后把连接适配器的jar文件和消息中间件的库文件一起提供给北大艾斯应用服务器。
接下来编写消息服务配置文件。配置文件中有三条记录,每一条记录代表一个消息服务。这三个消息服务分别使用JORAMAdapter、ActiveMQAdapter和SonicMQAdapter这三个连接适配器。
下为北大艾斯应用服务器的消息服务配置文件<Config>
<Service Class=″JMSService″Name=″JORAM″LoaderDir=″jms/joram″>
<Attribute Name=″providerAgentClass″Value=″JORAMAdapter″/>
</Service>
<Service Class=″JMSService″Name=″ActiveMQ″LoaderDir=″jms/activemq″>
<Attribute Name=″providerAgentClass″Value=″ActiveMQAdapter″/>
</Service>
<Service Class=″JMSService″Name=″SonicMQ″LoaderDir=″jms/sonicmq″>
<Attribute Name=″providerAgentClass″Value=″SonicMQAdapter″/>
</Service>
</Config>
其中,Class=″JMSService″指定消息服务的实现类,Name=″xxx″指定消息服务的名字,LoaderDir=″xxx″指定连接适配器库文件的位置,<AttributeName=″providerAgentClass″Value=″xxx″/>指定连接适配器的启动类。
最后北大艾斯应用服务器根据配置文件中的记录信息动态启动这三个消息服务。动态启动消息服务使用的动态加载机制是Java语言提供的类动态装载和反射机制。
使用本发明提出的消息服务动态接入方法,非常方便地为北大艾斯应用服务器这个J2EE构件运行支撑平台建立了消息中间件的动态连接机制,使其可以动态接入多个消息服务。
权利要求
1.一种构件运行支撑平台中接入消息服务的方法,其步骤包括1)根据构件运行支撑平台设定该平台所需消息服务的功能;2)根据上述功能设定消息中间件所需提供的功能;3)将上述消息中间件所需提供的每一功能用一方法表示;4)将上述方法封装在一接口中,此接口作为不同连接适配器面向构件运行支撑平台的统一接口;5)在各消息中间件中选定能够提供上述相应功能的一个或多个方法,进行封装或组合,为各消息中间件实现包含4)所述统一接口的各消息中间件连接适配器;6)构件运行支撑平台管理模块根据连接适配器的统一接口编写消息服务的实现类;7)构件运行支撑平台管理模块编写启动消息服务的代码;8)上述启动指定消息服务的代码运行时,由消息服务的实现类调用指定的消息中间件连接适配器;9)通过该消息中间件连接适配器启动该消息中间件,接入指定的消息服务。
2.如权利要求1所述的构件运行支撑平台中接入消息服务的方法,其特征在于上述消息中间件所需提供的功能为消息目的地的创建方法和删除方法,连接工厂的创建方法和删除方法,消息中间件的启动方法和关闭方法所表示的功能。
3.如权利要求2所述的构件运行支撑平台中接入消息服务的方法,其特征在于所述各消息中间件连接适配器中消息中间件的启动方法包含消息中间件的启动逻辑,按照具体消息中间件产品的要求来编写;该方法被调用时,通过其方法参数读入消息中间件的通用配置信息;通过设置的环境变量中包含的配置文件的路径和名字读入配置文件中包含的特定配置信息,启动该消息中间件;所述各消息中间件连接适配器中消息中间件的关闭方法被调用时,按照消息中间件的关闭步骤关闭消息中间件。
4.如权利要求3所述的构件运行支撑平台中接入消息服务的方法,其特征在于在上述关闭过程中把消息中间件中需要持久保存的信息写入持久存储器,释放已分配的资源。
5.如权利要求2所述的构件运行支撑平台中接入消息服务的方法,其特征在于所述消息目的地的创建方法包括队列型消息目的地的创建方法和主题型消息目的地的创建方法;所述连接工厂的创建方法包括队列型连接工厂的创建方法和主题型连接工厂的创建方法。
6.如权利要求5所述的构件运行支撑平台中接入消息服务的方法,其特征在于所述各消息中间件连接适配器中队列型消息目的地的创建方法和主题型消息目的地的创建方法的方法参数为消息目的地的名字;该连接适配器中配置一个消息目的地列表,列表项是已经创建的消息目的地,当这两方法被调用时,先判断给定名字的消息目的地是否在列表中存在,如果存在则直接返回该消息目的地,如果不存在则创建一个这个名字的消息目的地,并把它放到列表中,然后返回这个消息目的地;如果已经存在的消息目的地和需要创建的消息目的地有相同的名字但是类型不同,创建消息目的地失败,打印出错信息;所述各消息中间件连接适配器中消息目的地的删除方法被调用时,该方法关闭指定的消息目的地,并把消息目的地从消息目的地列表中删除。
7.如权利要求5所述的构件运行支撑平台中接入消息服务的方法,其特征在于所述各消息中间件连接适配器中队列型连接工厂的创建方法和主题型连接工厂的创建方法具有统一的接口,被调用时分别创建到消息中间件的队列类型和主题类型的连接;该连接适配器配置一个连接工厂列表,当需要创建新的连接工厂时首先检查该列表,如果指定名字的连接工厂已经存在并且类型和需要创建的连接工厂的类型一致,则直接从列表中取出这个连接工厂返回给方法调用者;如果列表中存在与需要创建的连接工厂同名但是类型不同的连接工厂则创建连接工厂失败,打印错误信息;所述各消息中间件连接适配器中连接工厂的删除方法被调用时,该方法关闭指定的连接工厂,并把连接工厂从列表中删除。
8.如权利要求1所述的构件运行支撑平台中接入消息服务的方法,其特征在于将消息中间件连接适配器代码和该消息中间件运行所需代码编译为库文件,提供给构件运行支撑平台。
9.如权利要求8所述的构件运行支撑平台中接入消息服务的方法,其特征在于构件运行支撑平台通过动态加载机制在运行时刻动态获得上述库文件。
10.如权利要求1或8或9所述的构件运行支撑平台中接入消息服务的方法,其特征在于构件运行支撑平台管理模块设有一配置文件,配置文件中可添加记录,每一条记录代表一个消息服务;每条记录由两部分组成,第一部分指明消息服务的实现类,第二部分指明消息服务实现类要使用的消息中间件连接适配器名称和所在位置;构件运行支撑平台需要提供消息服务时就在配置文件中添加一条记录,构件运行支撑平台根据新添加的记录启动新添加的消息服务。
全文摘要
本发明涉及一种构件运行支撑平台中接入消息服务的方法,根据连接适配器的统一接口编写构件运行支撑平台的消息服务的实现类;选定所需的消息中间件的连接适配器和消息中间件;编写构件运行支撑平台消息服务配置文件;创建消息服务类的实例、启动消息服务中间件。采用本发明提供的方法,可以在不对构件运行支撑平台本身做出修改的前提下,通过编写消息中间件连接适配器和修改配置文件的方法方便灵活地为平台动态接入新的消息服务。
文档编号G06F9/46GK101078995SQ20071011067
公开日2007年11月28日 申请日期2007年6月8日 优先权日2007年6月8日
发明者周明辉, 曹东刚, 梅宏, 赵东 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1