本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別是涉及基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法及裝置。
背景技術(shù):
隨著大數(shù)據(jù)云計算的來臨,分布式應(yīng)用程序已成為系統(tǒng)架構(gòu)的主流設(shè)計,但在設(shè)計分布式系統(tǒng)時,系統(tǒng)程序之間的耦合度尤為重要。耦合意味著兩個系統(tǒng)程序或者多個系統(tǒng)程序之間的相互依賴關(guān)系。一般簡單的方式是在所有的系統(tǒng)程序中從架構(gòu)設(shè)計上與其他程序間的交叉實現(xiàn),這樣必然會導(dǎo)致,一個系統(tǒng)程序改變,另一個應(yīng)用程序也要跟著改變。這種架構(gòu)是一種高耦合的應(yīng)用。在系統(tǒng)維護管理上會造成巨大的困難,因為即使很小的一個改動,很可能會涉及到整個大系統(tǒng)。低耦合是一種一個應(yīng)用的改變不會影響到其他系統(tǒng)應(yīng)用的集成方式。大數(shù)據(jù)來臨同時也面臨著大數(shù)據(jù)的處理、高并發(fā)等等問題,這是對一個企業(yè)的挑戰(zhàn),也是對一個系統(tǒng)的程序設(shè)計的挑戰(zhàn)。
在程序設(shè)計采用低耦合插件化的設(shè)計模式,可以在大數(shù)據(jù)緩沖上采用了ActiveMQ(簡稱MQ)。ActiveMQ就是采用低耦合的應(yīng)用架構(gòu)。任何一個應(yīng)用對ActiveMQ的調(diào)用不依賴與任何其他應(yīng)用,沒有任何依賴或者順序要求,ActiveMQ是一款支持高并發(fā),高吞吐量的消息中間件。若系統(tǒng)架構(gòu)是采用類似OSGI的插件化模式開發(fā),區(qū)別于傳統(tǒng)普通的應(yīng)用,傳統(tǒng)普通的應(yīng)用整個系統(tǒng)一般都是只有一個類加載器,而插件化模式開發(fā)的系統(tǒng)由于是插件化系統(tǒng),每個插件及依賴于主框架提供的服務(wù)又都可以獨立運行,所以每個插件都擁有自己的類加載器。
而調(diào)用的MQ的提供API服務(wù)是由主框架提供的。由于MQ提供API的自身機制,在序列化的時候,只允許當(dāng)前類加載器去反序列數(shù)據(jù),也就是哪個應(yīng)用啟動的MQ的API服務(wù),MQ的API服務(wù)在反序列化的時候,就只能通過那個應(yīng)用的類加載器來反序列化數(shù)據(jù),所以當(dāng)子插件在調(diào)用主架構(gòu)提供的MQ的API服務(wù)時,就無法序列化插件自身加載的類。例如:MQ的API服務(wù)是有由A框架啟動的,那么他的加載器為a,子插件B的類加載器b,加載了一個類b1.class,當(dāng)B插件在調(diào)用A框架提供的MQ的API服務(wù)將數(shù)據(jù)序列化成b1時,就會拋出類找不到異常(ClassNotFoundException),因為加載器a根本沒有加載類b1.class。參考圖1,該圖為原生態(tài)方式,原生態(tài)MQ提供的API服務(wù)在啟動的時候,只能使用當(dāng)前啟動它容器或框架的類加載器,所以當(dāng)其他類加載器加載的應(yīng)用去調(diào)用MQ的API服務(wù)時,MQ的API服務(wù)就從自己身的類加載中找不到要反序列化的類對象,這時MQ的API服務(wù)就會拋出異常。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是提供基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法及裝置,以實現(xiàn)避免ActiveMQ的API服務(wù)拋出異常。
為解決上述技術(shù)問題,本發(fā)明提供基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法,該方法包括:
對消息中間件ActiveMQ的API服務(wù)進(jìn)行修改,使修改后的API服務(wù)支持自定義類加載器;
在反序列化數(shù)據(jù)時,調(diào)用修改后的API服務(wù);
通過修改后的API服務(wù)在類加載器中查找對應(yīng)的類組件,利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化。
優(yōu)選的,對消息中間件ActiveMQ的API服務(wù)進(jìn)行修改,使修改后的API服務(wù)支持自定義類加載器,包括:
定義接口SynObjectMessage;
對于接口SynObjectMessage,增加支持自定義類加載器的函數(shù)getObject(ClassLoader classLoader)。
優(yōu)選的,接口SynObjectMessage繼承接口ObjectMessage。
優(yōu)選的,所述利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化之后,還包括:
將數(shù)據(jù)反序列化為類對象。
本發(fā)明還提供一種基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)裝置,用于實現(xiàn)上述基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法,該裝置包括:
修改模塊,用于對消息中間件ActiveMQ的API服務(wù)進(jìn)行修改,使修改后的API服務(wù)支持自定義類加載器;
調(diào)用模塊,用于在反序列化數(shù)據(jù)時,調(diào)用修改后的API服務(wù);
查找模塊,用于通過修改后的API服務(wù)在類加載器中查找對應(yīng)的類組件,利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化。
優(yōu)選的,所述修改模塊包括:
定義單元,用于定義接口SynObjectMessage;
增加單元,用于對于接口SynObjectMessage,增加支持自定義類加載器的函數(shù)getObject(ClassLoader classLoader)。
優(yōu)選的,接口SynObjectMessage繼承接口ObjectMessage。
優(yōu)選的,所述查找模塊還包括:
類對象生成單元,用于將數(shù)據(jù)反序列化為類對象。
本發(fā)明所提供的基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法及裝置,對消息中間件ActiveMQ的API服務(wù)進(jìn)行修改,使修改后的API服務(wù)支持自定義類加載器;在反序列化數(shù)據(jù)時,調(diào)用修改后的API服務(wù);通過修改后的API服務(wù)在類加載器中查找對應(yīng)的類組件,利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化??梢?,對MQ提供的API進(jìn)行了改進(jìn),使API服務(wù)能實現(xiàn)自定義類加載器,讓MQ原生態(tài)的API支持自定義類加載器,如此在調(diào)用MQ的API服務(wù)將數(shù)據(jù)反序列化成指定類對象的時候,為其指定類加載器,這樣MQ服務(wù)在反序列化數(shù)據(jù)的時候就會在指定的類加載器中找到相應(yīng)的類來進(jìn)行反序列化,因此,ActiveMQ的API服務(wù)具有自定義設(shè)置類加載器的能力,實現(xiàn)異構(gòu)類加載器的數(shù)據(jù)反序列化,避免ActiveMQ的API服務(wù)拋出異常。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為原生態(tài)MQ提供的API服務(wù)示意圖;
圖2為本發(fā)明所提供的基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法的流程圖;
圖3為改進(jìn)后的API服務(wù)示意圖;
圖4為JMS中針對消息Message支持的五種類型接口示意圖;
圖5為本發(fā)明所提供的基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)裝置的結(jié)構(gòu)示意圖。
具體實施方式
本發(fā)明的核心是提供基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法及裝置,以實現(xiàn)避免ActiveMQ的API服務(wù)拋出異常。
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
術(shù)語解釋如下:
ActiveMQ:簡稱:MQ,是一種面向消息的,能夠跨越多語言和多系統(tǒng)的應(yīng)用集成消息通信中間件。
序列化:將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換成二進(jìn)制串的過程。
反序列化:將在序列化過程中所生成的二進(jìn)制串轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu)或者對象的過程。
類加載器:是JavaTM中的一個很重要的概念。類加載器負(fù)責(zé)加載Java類的字節(jié)代碼到Java虛擬機中。
OSGI:OSGi(Open Service Gateway Initiative)技術(shù)是Java動態(tài)化模塊化系統(tǒng)的一系列規(guī)范。OSGi一方面指維護OSGi規(guī)范的OSGI官方聯(lián)盟,另一方面指的是該組織維護的基于Java語言的服務(wù)(業(yè)務(wù))規(guī)范。簡單來說,OSGi可以認(rèn)為是Java平臺的模塊層。
API:API(Application Programming Interface,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù),目的是提供應(yīng)用程序與開發(fā)人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機制的細(xì)節(jié)。
JMS:JMS即Java消息服務(wù)(Java Message Service)應(yīng)用程序接口,是一個Java平臺中關(guān)于面向消息中間件(MOM)的API,用于在兩個應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。Java消息服務(wù)是一個與具體平臺無關(guān)的API,絕大多數(shù)MOM提供商都對JMS提供支持。它便于消息系統(tǒng)中的Java應(yīng)用程序進(jìn)行消息交換,并且通過提供標(biāo)準(zhǔn)的產(chǎn)生、發(fā)送、接收消息的接口簡化企業(yè)應(yīng)用的開發(fā)。
請參考圖2,圖2為本發(fā)明所提供的基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法的流程圖,該方法包括:
S11:對消息中間件ActiveMQ的API服務(wù)進(jìn)行修改,使修改后的API服務(wù)支持自定義類加載器;
S12:在反序列化數(shù)據(jù)時,調(diào)用修改后的API服務(wù);
S13:通過修改后的API服務(wù)在類加載器中查找對應(yīng)的類組件,利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化。
可見,對MQ提供的API進(jìn)行了改進(jìn),使API服務(wù)能實現(xiàn)自定義類加載器,讓MQ原生態(tài)的API支持自定義類加載器,如此在調(diào)用MQ的API服務(wù)將數(shù)據(jù)反序列化成指定類對象的時候,為其指定類加載器,這樣MQ服務(wù)在反序列化數(shù)據(jù)的時候就會在指定的類加載器中找到相應(yīng)的類來進(jìn)行反序列化,因此,ActiveMQ的API服務(wù)具有自定義設(shè)置類加載器的能力,實現(xiàn)異構(gòu)類加載器的數(shù)據(jù)反序列化,避免ActiveMQ的API服務(wù)拋出異常。
具體的,經(jīng)過針對MQ反序列化的研究,以及針對MQ提供的API源代碼的分析,實現(xiàn)自定義類加載器。針對MQ提供的API進(jìn)行了大量的重新構(gòu)造、改進(jìn),使其可以提供實現(xiàn)自定義類加載器的功能。
參考圖3,改進(jìn)后,讓MQ原生態(tài)的API支持自定義類加載器,則在調(diào)用MQ的API服務(wù)將數(shù)據(jù)反序列化成指定類對象的時候,為其指定類加載器,這樣MQ服務(wù)在反序列化數(shù)據(jù)的時候就會在指定的類加載器中找到相應(yīng)的類來進(jìn)行反序列化。
基于上述方法,進(jìn)一步的,步驟S11的過程具體包括:定義接口SynObjectMessage;對于接口SynObjectMessage,增加支持自定義類加載器的函數(shù)getObject(ClassLoader classLoader)。
其中,接口SynObjectMessage繼承接口ObjectMessage。
詳細(xì)的,MQ是一個完全支持JMS1.1和J2EE1.4規(guī)范的JMS Provider實現(xiàn),所以MQ也完全遵守JMS協(xié)議規(guī)范,在JMS中針對消息Message支持五種類型,如下:
1、StreamMessage:Java數(shù)據(jù)流消息,用標(biāo)準(zhǔn)流操作來順序的填充和讀取。
2、MapMessage:一個Map類型的消息;名稱為string類型,而值為Java的基本類型。
3、TextMessage:普通字符串消息,包含一個String。
4、ObjectMessage:對象消息,包含一個可序列化的Java對象。
5、BytesMessage:二進(jìn)制數(shù)組消息,包含一個byte[]。
基于ObjectMessage對象,如圖4,在MQ中ActiveMQObjectMessage組件中實現(xiàn)了ObjectMessage對象的功能,由于原生的JMS提供的ObjectMessage接口本身就不支持自定義類加載器,所以MQ自然也不支持自定義設(shè)置類加載器。
如圖4,定義了接口SynObjectMessage接口,并繼承了接口ObjectMessage,同時增加了支持自定義設(shè)置類加載器的方法定義getObject(ClassLoader classLoader)并返回可序列化的對象Serializable對象。
SynActiveMQObjectMessage實現(xiàn)了SynObjectMessage接口并繼承了ActiveMQObjectMessage,使之即具有自定義設(shè)置類加載器的功能,同時也支持原有MQ的API服務(wù)提供的所有方法函數(shù)。
通過針對ActiveMQ的API服務(wù)源代碼的修改,以及部分接口的復(fù)寫,將原有返回ActiveMQObjectMessage對象替換成SynActiveMQObjectMessage對象。使之ActiveMQ的API服務(wù)具有自定義設(shè)置類加載器的能力,實現(xiàn)異構(gòu)類加載器的數(shù)據(jù)反序列化。
進(jìn)一步的,步驟S13中,利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化之后,還包括:將數(shù)據(jù)反序列化為類對象。
請參考圖5,圖5為本發(fā)明所提供的基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)裝置的結(jié)構(gòu)示意圖,該裝置用于實現(xiàn)上述基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法,該裝置包括:
修改模塊101,用于對消息中間件ActiveMQ的API服務(wù)進(jìn)行修改,使修改后的API服務(wù)支持自定義類加載器;
調(diào)用模塊102,用于在反序列化數(shù)據(jù)時,調(diào)用修改后的API服務(wù);
查找模塊103,用于通過修改后的API服務(wù)在類加載器中查找對應(yīng)的類組件,利用查找到的類組件來對數(shù)據(jù)進(jìn)行反序列化。
基于上述裝置,進(jìn)一步的,所述修改模塊包括:
定義單元,用于定義接口SynObjectMessage;
增加單元,用于對于接口SynObjectMessage,增加支持自定義類加載器的函數(shù)getObject(ClassLoader classLoader)。
其中,接口SynObjectMessage繼承接口ObjectMessage。
進(jìn)一步的,所述查找模塊還包括:類對象生成單元,用于將數(shù)據(jù)反序列化為類對象。
以上對本發(fā)明所提供的基于ActiveMQ異構(gòu)類加載器反序列化的實現(xiàn)方法及裝置進(jìn)行了詳細(xì)介紹。本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進(jìn)行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想。應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以對本發(fā)明進(jìn)行若干改進(jìn)和修飾,這些改進(jìn)和修飾也落入本發(fā)明權(quán)利要求的保護范圍內(nèi)。