基於ActiveMQ異構類加載器反序列化的實現方法及裝置與流程
2023-05-10 01:01:56 3

本發明涉及計算機技術領域,特別是涉及基於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異構類加載器反序列化的實現方法及裝置進行了詳細介紹。本文中應用了具體個例對本發明的原理及實施方式進行了闡述,以上實施例的說明只是用於幫助理解本發明的方法及其核心思想。應當指出,對於本技術領域的普通技術人員來說,在不脫離本發明原理的前提下,還可以對本發明進行若干改進和修飾,這些改進和修飾也落入本發明權利要求的保護範圍內。