基于ActiveMQ异构类加载器反序列化的实现方法及装置与流程

文档序号:12664352阅读:261来源:国知局
基于ActiveMQ异构类加载器反序列化的实现方法及装置与流程

本发明涉及计算机技术领域,特别是涉及基于ActiveMQ异构类加载器反序列化的实现方法及装置。



背景技术:

随着大数据云计算的来临,分布式应用程序已成为系统架构的主流设计,但在设计分布式系统时,系统程序之间的耦合度尤为重要。耦合意味着两个系统程序或者多个系统程序之间的相互依赖关系。一般简单的方式是在所有的系统程序中从架构设计上与其他程序间的交叉实现,这样必然会导致,一个系统程序改变,另一个应用程序也要跟着改变。这种架构是一种高耦合的应用。在系统维护管理上会造成巨大的困难,因为即使很小的一个改动,很可能会涉及到整个大系统。低耦合是一种一个应用的改变不会影响到其他系统应用的集成方式。大数据来临同时也面临着大数据的处理、高并发等等问题,这是对一个企业的挑战,也是对一个系统的程序设计的挑战。

在程序设计采用低耦合插件化的设计模式,可以在大数据缓冲上采用了ActiveMQ(简称MQ)。ActiveMQ就是采用低耦合的应用架构。任何一个应用对ActiveMQ的调用不依赖与任何其他应用,没有任何依赖或者顺序要求,ActiveMQ是一款支持高并发,高吞吐量的消息中间件。若系统架构是采用类似OSGI的插件化模式开发,区别于传统普通的应用,传统普通的应用整个系统一般都是只有一个类加载器,而插件化模式开发的系统由于是插件化系统,每个插件及依赖于主框架提供的服务又都可以独立运行,所以每个插件都拥有自己的类加载器。

而调用的MQ的提供API服务是由主框架提供的。由于MQ提供API的自身机制,在序列化的时候,只允许当前类加载器去反序列数据,也就是哪个应用启动的MQ的API服务,MQ的API服务在反序列化的时候,就只能通过那个应用的类加载器来反序列化数据,所以当子插件在调用主架构提供的MQ的API服务时,就无法序列化插件自身加载的类。例如:MQ的API服务是有由A框架启动的,那么他的加载器为a,子插件B的类加载器b,加载了一个类b1.class,当B插件在调用A框架提供的MQ的API服务将数据序列化成b1时,就会抛出类找不到异常(ClassNotFoundException),因为加载器a根本没有加载类b1.class。参考图1,该图为原生态方式,原生态MQ提供的API服务在启动的时候,只能使用当前启动它容器或框架的类加载器,所以当其他类加载器加载的应用去调用MQ的API服务时,MQ的API服务就从自己身的类加载中找不到要反序列化的类对象,这时MQ的API服务就会抛出异常。



技术实现要素:

本发明的目的是提供基于ActiveMQ异构类加载器反序列化的实现方法及装置,以实现避免ActiveMQ的API服务抛出异常。

为解决上述技术问题,本发明提供基于ActiveMQ异构类加载器反序列化的实现方法,该方法包括:

对消息中间件ActiveMQ的API服务进行修改,使修改后的API服务支持自定义类加载器;

在反序列化数据时,调用修改后的API服务;

通过修改后的API服务在类加载器中查找对应的类组件,利用查找到的类组件来对数据进行反序列化。

优选的,对消息中间件ActiveMQ的API服务进行修改,使修改后的API服务支持自定义类加载器,包括:

定义接口SynObjectMessage;

对于接口SynObjectMessage,增加支持自定义类加载器的函数getObject(ClassLoader classLoader)。

优选的,接口SynObjectMessage继承接口ObjectMessage。

优选的,所述利用查找到的类组件来对数据进行反序列化之后,还包括:

将数据反序列化为类对象。

本发明还提供一种基于ActiveMQ异构类加载器反序列化的实现装置,用于实现上述基于ActiveMQ异构类加载器反序列化的实现方法,该装置包括:

修改模块,用于对消息中间件ActiveMQ的API服务进行修改,使修改后的API服务支持自定义类加载器;

调用模块,用于在反序列化数据时,调用修改后的API服务;

查找模块,用于通过修改后的API服务在类加载器中查找对应的类组件,利用查找到的类组件来对数据进行反序列化。

优选的,所述修改模块包括:

定义单元,用于定义接口SynObjectMessage;

增加单元,用于对于接口SynObjectMessage,增加支持自定义类加载器的函数getObject(ClassLoader classLoader)。

优选的,接口SynObjectMessage继承接口ObjectMessage。

优选的,所述查找模块还包括:

类对象生成单元,用于将数据反序列化为类对象。

本发明所提供的基于ActiveMQ异构类加载器反序列化的实现方法及装置,对消息中间件ActiveMQ的API服务进行修改,使修改后的API服务支持自定义类加载器;在反序列化数据时,调用修改后的API服务;通过修改后的API服务在类加载器中查找对应的类组件,利用查找到的类组件来对数据进行反序列化。可见,对MQ提供的API进行了改进,使API服务能实现自定义类加载器,让MQ原生态的API支持自定义类加载器,如此在调用MQ的API服务将数据反序列化成指定类对象的时候,为其指定类加载器,这样MQ服务在反序列化数据的时候就会在指定的类加载器中找到相应的类来进行反序列化,因此,ActiveMQ的API服务具有自定义设置类加载器的能力,实现异构类加载器的数据反序列化,避免ActiveMQ的API服务抛出异常。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为原生态MQ提供的API服务示意图;

图2为本发明所提供的基于ActiveMQ异构类加载器反序列化的实现方法的流程图;

图3为改进后的API服务示意图;

图4为JMS中针对消息Message支持的五种类型接口示意图;

图5为本发明所提供的基于ActiveMQ异构类加载器反序列化的实现装置的结构示意图。

具体实施方式

本发明的核心是提供基于ActiveMQ异构类加载器反序列化的实现方法及装置,以实现避免ActiveMQ的API服务抛出异常。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

术语解释如下:

ActiveMQ:简称:MQ,是一种面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。

序列化:将数据结构或对象转换成二进制串的过程。

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

类加载器:是JavaTM中的一个很重要的概念。类加载器负责加载Java类的字节代码到Java虚拟机中。

OSGI:OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范。OSGi一方面指维护OSGi规范的OSGI官方联盟,另一方面指的是该组织维护的基于Java语言的服务(业务)规范。简单来说,OSGi可以认为是Java平台的模块层。

API:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

JMS:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

请参考图2,图2为本发明所提供的基于ActiveMQ异构类加载器反序列化的实现方法的流程图,该方法包括:

S11:对消息中间件ActiveMQ的API服务进行修改,使修改后的API服务支持自定义类加载器;

S12:在反序列化数据时,调用修改后的API服务;

S13:通过修改后的API服务在类加载器中查找对应的类组件,利用查找到的类组件来对数据进行反序列化。

可见,对MQ提供的API进行了改进,使API服务能实现自定义类加载器,让MQ原生态的API支持自定义类加载器,如此在调用MQ的API服务将数据反序列化成指定类对象的时候,为其指定类加载器,这样MQ服务在反序列化数据的时候就会在指定的类加载器中找到相应的类来进行反序列化,因此,ActiveMQ的API服务具有自定义设置类加载器的能力,实现异构类加载器的数据反序列化,避免ActiveMQ的API服务抛出异常。

具体的,经过针对MQ反序列化的研究,以及针对MQ提供的API源代码的分析,实现自定义类加载器。针对MQ提供的API进行了大量的重新构造、改进,使其可以提供实现自定义类加载器的功能。

参考图3,改进后,让MQ原生态的API支持自定义类加载器,则在调用MQ的API服务将数据反序列化成指定类对象的时候,为其指定类加载器,这样MQ服务在反序列化数据的时候就会在指定的类加载器中找到相应的类来进行反序列化。

基于上述方法,进一步的,步骤S11的过程具体包括:定义接口SynObjectMessage;对于接口SynObjectMessage,增加支持自定义类加载器的函数getObject(ClassLoader classLoader)。

其中,接口SynObjectMessage继承接口ObjectMessage。

详细的,MQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现,所以MQ也完全遵守JMS协议规范,在JMS中针对消息Message支持五种类型,如下:

1、StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取。

2、MapMessage:一个Map类型的消息;名称为string类型,而值为Java的基本类型。

3、TextMessage:普通字符串消息,包含一个String。

4、ObjectMessage:对象消息,包含一个可序列化的Java对象。

5、BytesMessage:二进制数组消息,包含一个byte[]。

基于ObjectMessage对象,如图4,在MQ中ActiveMQObjectMessage组件中实现了ObjectMessage对象的功能,由于原生的JMS提供的ObjectMessage接口本身就不支持自定义类加载器,所以MQ自然也不支持自定义设置类加载器。

如图4,定义了接口SynObjectMessage接口,并继承了接口ObjectMessage,同时增加了支持自定义设置类加载器的方法定义getObject(ClassLoader classLoader)并返回可序列化的对象Serializable对象。

SynActiveMQObjectMessage实现了SynObjectMessage接口并继承了ActiveMQObjectMessage,使之即具有自定义设置类加载器的功能,同时也支持原有MQ的API服务提供的所有方法函数。

通过针对ActiveMQ的API服务源代码的修改,以及部分接口的复写,将原有返回ActiveMQObjectMessage对象替换成SynActiveMQObjectMessage对象。使之ActiveMQ的API服务具有自定义设置类加载器的能力,实现异构类加载器的数据反序列化。

进一步的,步骤S13中,利用查找到的类组件来对数据进行反序列化之后,还包括:将数据反序列化为类对象。

请参考图5,图5为本发明所提供的基于ActiveMQ异构类加载器反序列化的实现装置的结构示意图,该装置用于实现上述基于ActiveMQ异构类加载器反序列化的实现方法,该装置包括:

修改模块101,用于对消息中间件ActiveMQ的API服务进行修改,使修改后的API服务支持自定义类加载器;

调用模块102,用于在反序列化数据时,调用修改后的API服务;

查找模块103,用于通过修改后的API服务在类加载器中查找对应的类组件,利用查找到的类组件来对数据进行反序列化。

基于上述装置,进一步的,所述修改模块包括:

定义单元,用于定义接口SynObjectMessage;

增加单元,用于对于接口SynObjectMessage,增加支持自定义类加载器的函数getObject(ClassLoader classLoader)。

其中,接口SynObjectMessage继承接口ObjectMessage。

进一步的,所述查找模块还包括:类对象生成单元,用于将数据反序列化为类对象。

以上对本发明所提供的基于ActiveMQ异构类加载器反序列化的实现方法及装置进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1