1 RSA的模型轉換框架
IBM Rational Software Architect(RSA)是IBM Rational新一代的建模和開發工具,它構建在開放的、可擴展的Eclipse3.0平臺之上,集成了UML2.0和MDA技術,實現了多種行業的最新標準,提供了靈活的插件擴展機制。眾所周知,UML2.0和MDA技術的應用,可以有效地解決傳統軟件開發過程中的生產效率問題、系統移植問題、互操作問題以及文檔和系統后期的維護問題。而實現MDA的關鍵則是通過建立轉換(Transformation)機制,實現模型到模型、模型到代碼的轉換。
為了支持模型驅動開發過程中各種模型之間的轉換,RSA提供了一個功能強大、易于擴展的模型轉換框架(Model Transformation Framework),該框架是一個基于規則的執行引擎,基于該框架,模型轉換的開發者只需定義一系列轉換規則即可,模型轉換框架會負責加載執行規則,并提供統一的模型轉換配置管理。該框架基于Eclipse 3.0和Eclipse Model Framework(EMF)、UML2、Graphical Editing Framework(GEF)和插件開發環境(PDE),支持標準設計(比如統一建模語言,UML )的模型構建,提供了從UML到Java、UML到C++、UML到EJB的模型轉化,為模型驅動軟件開發(MDA)提供了強大的工具支持。
本文就是基于RSA提供的模型轉換功能,從實現角度說明如何從ESB模型轉化為可部署、可執行的Jacl腳本。接下來讓我們來看看什么是Jacl語言以及如何在WebSphere中通過腳本管理編制程序(wsadmin)調用Jacl腳本文件的。
![]() ![]() |
![]()
|
2 WebSphere與Jacl語言
2.1 Jacl語言
Jacl(Java Command Language)是Tcl(Tool Command Language)腳本語言為適應Java環境的一個版本實現。Tcl是由Sun(by John Ousterhout)開發的一個非常優秀的編程語言。作為一種嵌入式腳本語言,Tcl的設計初衷是為了支持快速地開發在x 窗口系統下運行的應用程序。然而,Tcl的靈活性、易用性使得它被引入到幾乎所有的操作系統中。Jacl 作為Tcl的Java實現,完全支持JAVA,其內核解釋器完全用Java語言編寫,可以運行在任何Java虛擬機上,可以完全訪問Java API。Jacl使得Tcl可以作為Java 應用的腳本語言,幫助用戶更快速、更容易地生成用戶圖形界面的Java程序。
Jacl通過引用一個Java Package的組件提供Java和Tcl的接口,使得Tcl腳本具有如下能力:
另外,Jacl還支持Tcl腳本訪問JavaBeans的方法、屬性和事件的能力。它允許Tcl腳本創建JavaBeans,調用JavaBeans的方法,獲取和設置JavaBeans的屬性。此外,它還提供了Bean事件異常處理的支持。這些Bean事件被暴露給Tcl,可以在Tcl中通過綁定Tcl代碼到事件上處理事件異常。
對于Tcl編程者,Jacl提供了一個獨立于平臺的Tcl的實現。這意味著在Java運行的地方,Tcl都可以運行。另外一個好處是,Jacl具有豐富的Java API的支持。關于Jacl的語法,詳見http://tclJava.sourceforge.net/docs/website/index.html。
2.2 WebSphere管理腳本編制(wsadmin)
腳本編制是非圖形的備用方法,可以使用它來配置和管理應用程序及應用程序服務環境。WebSphere 管理(wsadmin)腳本編制程序是功能強大的、非圖形的命令解釋器環境,它允許用戶用腳本語言運行管理操作。用戶可以使用 wsadmin 工具執行那些可以用管理控制臺執行的相同任務。wsadmin 工具支持整個范圍的產品管理。下面列出了所有可以使用腳本編制完成的主題和任務:
圖1描述了 wsadmin 腳本編制解決方案中涉及的主要組件。
腳本使用這些對象與運行在 WebSphere Application Server 進程中的 MBean 通信。MBean 是表示 Java 管理擴展(JMX)資源的 Java 對象。JMX 是附加于 Java 2 Platform Standard Edition(J2SE)的可選軟件包。JMX 是提供簡單和標準方法來管理 Java 對象的一種技術。
wsadmin 工具通過一組管理對象來進行配置和管理,每個管理對象都有可用來執行管理任務的命令,這些管理對象包括AdminConfig、AdminControl、AdminApp、AdminTask 和 Help。
在WebSphere Application Server中,系統的管理功能可以分為兩個類別:WebSphere Application Server 的安裝和配置,管理WebSphere Application Server 安裝過程中正在運行的對象。下面我們舉例說明這兩個類別的不同。例如,對于WebSphere應用程序服務器,存在持久駐留在永久性存儲器庫中的服務器配置。用戶可以創建、查詢、更改或刪除此配置,而無需啟動應用程序服務器進程。而對于通過Java 管理擴展(JMX)MBean 正在運行的應用程序服務器的實例信息,則必須通過正在運行的對象上獲取。因為該實例保留了可查詢和更改的屬性以及可調用的操作,這些對正在運行的應用程序服務器所采用的運行操作將不會影響服務器的持久配置。
下表對wsadmin管理對象進行了對比說明。
以上我們對WebSphere腳本編制管理程序進行了簡要的介紹,下面重點介紹一下Jacl語言對wsadmin各管理對象的支持。
wsadmin 工具目前支持兩種腳本語言:Jacl 和 Jython。Jacl 是缺省指定的語言。 當使用腳本編制執行任務時,首先使用Jacl編寫腳本程序,在Jacl程序中,用戶可以調用wsadmin的各種管理對象對應用服務器進行管理和配置,包括對運行時對象的管理。然后調用腳本編制進程的命令wsadmin以啟動腳本編制客戶機,如下所示, 使用 -f 選項運行 wsadmin 工具,并將您要運行的命令放入文件中。關于在Jacl中使用wsadmin管理對象的方法,本文將在第4節中舉例說明。
|
![]() ![]() |
![]()
|
3 服務集成總線建模(SIBUS)
當前,企業服務總線(ESB)是討論最為熱烈的領域,它作為搭建SOA系統解決方案的基礎設施,提供了連接企業內部及跨企業間新的和現有軟件應用程序的功能,在實施SOA過程中起到了舉足輕重的作用。
IBM WebSphere Application Server V6 中提出的Service Integration Bus(SIBus)組件包括了許多構建ESB必要的功能特性,其中三個重要的組件:總線(Bus),目標(Destination),調解(Mediation)組成了SIBUS的消息傳遞引擎??偩€(Bus)是主要的消息傳輸機制,消息的發送者和接收者通過總線進行消息交換。每個總線包含了若干目標(Destination),每個目標是發送到總線中的消息的邏輯Target,消息的發送者將消息發送到總線目標,消息的消費者則通過訪問總線目標獲取消息,這就實現了消息用戶的松耦合。另外,消息在被接收者接收之前,可以在總線中由一個目標路由到另一個目標,或者改變消息的格式。調解(Mediation)實現了這種機制,它是一種綁定在目標上的組件,在消息到達這個目標時處理該消息。
圖2說明了總線中目標和調解的概念關系。
基于以上對WebSphere Application Server V6和SIBUS的介紹,我們已經基本了解到,SIBUS是ESB概念在WebSphere Application Server V6中的一種實現,它的提出可以更明確地支持服務集成和服務整合。在面向MDA的開發過程中,模型轉化功能可以將與平臺無關的模型(Platform Independent Model, PIM)轉化為與平臺相關的模型(Platform Specific Model, PSM),再將PSM轉化為具體的實現代碼或者部件,其中部件包括各種文檔、部署和構建腳本、測試部件,模式應用等等。為了簡化用戶開發ESB應用的復雜性,這里引入MDA的設計理念,從PIM的層面刻畫ESB,從PSM的層面刻畫SIBUS, 在這個實現過程當中,我們就需要將SIBUS模型轉化為可以直接部署執行的腳本,方便用戶以非圖形化的部署管理手段實現自動部署和安裝SIBUS相關資源的功能。Jacl作為一種獨立于平臺的強大的腳本編程語言被納入到WebSphere Application Server中,通過wsadmin腳本編制客戶機來解釋和執行。
接下來,我們將詳細討論如何利用RSA的模型轉換功能實現WebSphere Application Server SIBUS到Jacl的轉換。
![]() ![]() |
![]()
|
4 SIBUS模型到Jacl腳本的轉換開發
在這部分的敘述中,我們以一個典型的應用作為例子,說明如何將SIBUS模型轉化為Jacl部署腳本。圖3中,SIBus1擁有兩個成員服務器:Application Server 1和Application Server 2,消息從producer發送到Destination1,經過Mediation1的處理,轉發到Destination2,在Mediation2中根據消息的內容,將消息轉發到兩個接收者(Consumer1和Consumer2)中的一個。
4.1 創建插件工程
通過新建工程向導創建一個插件工程。該插件工程使用"帶轉換的插件模板"。利用該模板可以自動生成集成RSA模型轉換框架的代碼結構,包括轉換提供程序(TransformationProvider)、轉換(Transformation)。如果需要的話,可以同時定義轉換規則(Rule)。圖4--圖6顯示了創建該插件工程過程中的重要步驟。
4.2 擴展UML模型
UML的元素,例如類、接口、合作、組件、注釋、關系等,在對普通問題進行建模時基本上是可以滿足要求的。但是,針對特定的領域問題,有時候就需要擴展UML的元素模型來支持這種領域的特殊性。通常,我們使用UML Profile的stereotype來擴展當前UML模型的詞匯(關于UML Profile 和 stereotype 及其相關概念,請參考本文參考資料)。這里,針對SIBus建模問題,我們分別定義了Bus, Destination, Mediation, attach 等stereotype,并且對它們定義了一組標記值和不同的圖標,使得它們具有不同的視覺效果,如圖7所示。
4.3 創建JET模板
EMF工程(eclipse模型框架)包含了兩個非常強大的代碼生成的工具:Java 發射器模板JET(Java Emitter Templates)和JMerge(Java Merge)。其中JET是一個用來在Eclipse Modeling Framework (EMF)中生成代碼的開源工具。使用JET可以使用類似JSP一樣的語法(事實上是JSP語法的子集),輕松地編寫模板來表示用戶希望生成的代碼形式。JET是一個通用模板引擎,可以生成SQL,XML,Java代碼以及其它類型的文件。JET引擎位于org.eclipse.emf.codegen中,包含在EMF運行插件中。
在該模型轉換的實現中,我們使用JET作為Jacl腳本的模板,并應用了wsadmin的管理對象AdminTask 和AdminConfig。下面詳細介紹如何在該plug-in項目中,創建JET模板。
1) 在RSA的包瀏覽器中選擇該項目,在項目根目錄下,右鍵選擇New -> Folder, 添加一個templates的目錄。
2) 在項目src文件夾下,添加"jetsrc"文件夾,用來保存jet模板生成的Java類。
3) 在RSA的包瀏覽器中選擇該項目,右鍵選擇新建 ->其他 -> Java 發射器模板->將項目轉化為JET項目。點擊完畢,這將為項目增加JET Nature,而且一個JET Builder 也被將入這個工程,這樣每一個模板中的以jet為后綴結束的文件會自動被編譯稱為一個Java 類。
4) 修改JET設置。在RSA的包瀏覽器中選擇該項目,右鍵選擇屬性 -> JET 設置,設置模板容器 為temlpaltes,源容器為src。你可以設定多個容器,用空格分開。
5) 創建JET模板文件。這里,我們根據SIBUS配置和部署的需要,創建了若干JET 模板。每個模板分別對應一段Jacl腳本片斷,這些模板既可以單獨使用,也可以組合使用。清單1和清單2分別展示了創建Bus和創建Destination的JET模板。
|
|
6) 在創建了所有JET模板后,在保存這些JET模板的時候,JET builder會把所有的模板轉變為相應的Java類,保存在文件夾jetsrc中。這些Java類是就是模板轉換后的文件,每個類都有一個generate的方法。我們可以通過實例化這些類后,調用generate方法,用來返回相應的腳本片斷。
4.4 定義轉換規則(TransformationRule)
JET模板將Jacl腳本代碼化,便于在后面的代碼實現過程中調用。要實現SIBUS模型到Jacl腳本的轉換,我們還需要定義若干轉換規則。實際上,轉換邏輯的實現正是封裝在這些轉換規則中,負責將源模型轉化為目標模型或者部件的。轉換規則的實現類實現了模型轉換框架中提供的com.ibm.xtools.transform.core.AbstractRule接口。
這里,我們可以將所有的轉換邏輯寫在一條轉換規則中,但是,為了代碼編寫的模塊性和規范性,我們定義了若干轉換規則,每條規則實現了邏輯上相對獨立的一部分轉換功能,若干條規則組合在一起實現整個轉換功能。本例中,我們定義了七條轉換規則:創建總線規則(CreateBusRule), 添加總線成員規則(AddBusMemberToBusRule), 創建目標規則(CreateDestinationRule),創建調解規則( CreateMediationRule),創建JMS連接工廠規則(CreateJMSConnectionFactoryRule), 創建JMS激活規范規則(CreateJMSActivationSpecificationRule),創建JMS隊列規則(CreateJMSQueueRule)。每條轉換規則都利用當前轉換上下文(ITransformContext)中的源(Source),獲取其相關屬性,調用JET模板生成的Java類的generate方法,生成相應的Jacl腳本片斷。清單3列出了CreateBusRule的部分源代碼(其他規則源代碼,請參閱附件Sibus2JaclTranRules.zip)。
|
在定義了所有的轉換規則之后,根據轉換的先后順序,將以上規則添加到轉換(Transform)中,在本例中,我們定義了一個擴展至UMLTransform的轉換SIBusToJaclMainTransform,并在該轉換的initialize()方法中,按照部署和配置順序添加了以上規則,清單4列出了initialize()方法的部分源代碼。
|
4.5 運行測試
以上我們詳細介紹了如何利用RSA的模型轉換功能實現SIBus模型到Jacl腳本的轉換功能。下面我們來進行創建總線實例的運行測試。
首先,啟動RSA的運行環境,加載該轉換插件。創建一個UML模型,在模型中創建Bus類和BusMember類:
右鍵點擊其中一個Element,選擇轉換,之后會生成createBus.Jacl,如下所示:
|
下面,我們需要在WebSphere Application Server運行createBus.Jacl腳本文件。在部署測試之前,首先要準備WebSphere Application Server的環境,這包括安裝SDO Repository,Resource Adaptor,HTTP Channel以及和SIBus相關的應用。
1) 在Command窗口,進入WebSphere Application Server的bin 目錄。
2) 輸入如下命令,以-f 作為參數,指定要執行的Jacl文件。
|
3) 啟動WebSphere Application Server 管理控制臺,在服務集成欄中,點擊"總線",從右側的總線窗口中,可以看到一個名為"SIBus1"的總線被創建。
![]() ![]() |
![]()
|
結束語
ESB作為搭建SOA系統解決方案的基礎設施,是開發SOA應用的一個非常重要的部分,WebSphere Application Server 6.0中自帶的ESB組件SIBus就是ESB理念的一種實現,在很大程度上就可以滿足用戶的要求。將MDA的開發方法應用到SIBus組件的開發過程中,利用RSA提供的模型轉換框架,實現將SIBus模型轉化為可以在WebSphere Application Server中部署和運行的Jacl腳本, 可以大大簡化用戶開發、部署和配置的繁冗和難度。
原文轉自:http://www.anti-gravitydesign.com