所謂報文驅動,就是模塊間的相互調用通過定義了格式的報文傳遞輸入參數,返回值通過應答報文傳遞的模塊調用方式。模塊指實現獨立業務功能的服務類,而非方法間的調用。例如:轉賬模塊調用記賬模塊。模塊間的報文傳遞,可以是WebService、RMI等同步方式,也可以是MQ等異步方式。本文不是完整的實現過程,而是綱要,防止自己忘記的備忘錄。
本文的軟件系統架構參考《基于EJB 3.0的企業應用后端框架》。
1、創建數據庫及數據庫表。
2、創建實體類及相應的DAO類庫,本庫是EJB模塊,可以動態更換。實體類總是對應數據庫表,每個表對應一個或多個實體類。實體類是POJO對象。DAO類使用JPA完成實體對象的增、刪、改、查、鎖等操作,和具體業務邏輯無關。
(1)創建EJB項目,包含ejbModule、testcase、script等目錄。源碼放置到ejbModule目錄,測試代碼放置到testcase,數據庫相關腳本放置到Script目錄。
(2)給項目添加JPA支持。從ApplicationServer支持的JPA中選擇一款JPA實現。實際部署時,JPA模塊是可以動態更換的。
(3)編輯項目的持久化配置文件,和數據庫配置保持一致。
(4)給測試或JPA添加依賴的外部JAR包。
--------- 準備就緒
(5)從數據庫生成實體類并定制,確保每個實體類有唯一的序列化ID。每個實體類有主鍵,實體類和主鍵類均是可序列化的。如果實體對象和數據庫數據間要進行某種轉換動作,由實體類的Get/Set方法完成。
(6)編寫一個AbstractEnityDao類實現調用JPA完成實體對象的持久化操作。為每個實體類派生一個DAO類完成該實體的持久化。該DAO是一個SessionBean,且只實現本地方法。如果要對實體的值合法性進行檢查,則在DAO類完成。
(7)編寫DAO和實體類的測試代碼,確認每個DAO類均工作正常。
3、創建實體類及DAO類的client庫。本庫是普通的JAR包,給未來使用實體對象和DAO對象的對象使用。
(1)DAO類庫完成并定版后,創建JAR庫。
(2)復制DAO類庫的全部實體類到本庫,確保包名沒有變化。
(3)復制DAO類庫的全部DAO接口到本庫,確保包名沒有變化。
(4)編輯全部實體類,去掉@JPA的注釋并糾正import語句,以減少本庫的依賴性。
4、創建報文庫,本庫是普通Jar包。
(1)為每個報文創建一個報文類。報文類是POJO對象,且必須可序列化。
(2)如果使用報文的全部時JAVA代碼,則使用默認的Java序列化對象的方法傳遞報文對象。否則,實現序列化方法,將報文串轉換為報文對象和將報文對象轉換為報文串。Java內部使用報文對象,模塊間調用使用報文串。
(3)如果使用XML作為報文串,則可以為每個報文創建一個類和一個映射文件,通過XML通用類庫實現對象和串的轉換。
5、編寫業務服務庫,本庫是EJB模塊。
(1)創建AbstractBusinessService類,定義業務服務的接口,并實現通用的方法。
(2)為每個報文創建一個業務服務類繼承AbstractBusinessService類,并實現對報文的特殊處理。業務服務類是SessionBean,實現本地接口。
(3)為每個業務服務類編寫測試代碼,確保每個服務類均可以正常工作。
6、編寫業務引擎服務(EJB服務)
(1)本服務提供本地和遠程方法供Client使用,接收Client傳遞的業務報文對象,根據配置創建并調用業務服務對報文進行處理。
(2)業務引擎通常提供實時調用和MQ調用兩類引擎,后者是消息驅動Bean。
7、Web服務
(1)將業務引擎服務封裝為WebService或http/REST風格的服務,供外部系統調用。
------------- 完成全部項目
8、部署:將全部類庫打包為EAR發布,將報文庫發布給Java外部客戶。