WebSphere和Tuxedo Server整合方案1

CloudSpace發表於2008-07-08
 本文詳細介紹了 XMLink Wrapper 的整體架構設計、實現機制以及基於 XMLink Wrapper 的開發模式。使用 XMLink Wrapper,可以輕鬆實現 IBM WebSphere Application Server(作為客戶端)和 BEA Tuxedo Server(作為服務端)的整合。

  引言

  Prolifics 公司開發的 XMLink 是一種專門用於對基於 BEA Tuxedo 交易中介軟體技術開發的應用系統的資料、業務整合的介面卡產品。該介面卡全稱為 XMLink Tuxedo Adapter。它可以將 J2EE 應用程式連線到基於 BEA Tuxedo 開發的服務上,特別適用於基於IBM WebSphere Application Server 開發的 EJB, Servlet 和 JSP,以及基於 WebSphere Business Integration Family 開發的相應流程、服務等。但是,XMLink 的使用比較複雜,程式設計難度也較大。XMLink Wrapper 合理地抽取出 XMLink 中與 Tuxedo 相關的底層操作細節,將其封裝成可複用的、介面簡易的元件,從而大大降低了 WebSphere Application Server 和 Tuxedo 之間應用整合的難度。

  一、XMLink簡介

  XMLink的架構是完全符合J2C/J2EE架構規範的,它是針對Tuxedo專門實現的J2C聯結器。因此可以方便的跟其它Java應用進行互聯互通。

  圖1 XMLink體系結構示意圖


  XMLink提供了一個資源介面卡並且支援兩種情形的部署場景。J2EE資源介面卡不但能夠在有應用伺服器(比如IBM WebSphere Application Server)的環境中執行,而且能夠在獨立的Java應用程式中被呼叫執行。就像J2C架構一樣,XMLink架構也同樣提供了相應的訪問方式:JavaBean、Servlet、JSPs和EJB。

  XMLink Tuxedo Adapter允許使用者將任何已有的BEA Tuxedo應用無縫地整合到一個Java應用中,無論該應用是否部署在應用伺服器上。XMLink只需要標準的Tuxedo配置就能完成相關功能。這使得使用者可以方便快捷地訪問Tuxedo標準層中的相關服務。

  在Tuxedo中,使用IPC(Inter-Process Communication)訊息佇列等方式實現了在客戶端和伺服器端之間服務請求的傳遞。這些訊息被封裝在相應的緩衝區中。XMLink使用已有的IPC等配置方式,來跟相應的資料緩衝區互動資料,從而連線到Tuxedo的指定服務。

  在這個過程中,XMLink就像其它Tuxedo客戶端一樣,使用ATMI (Application to Transaction Monitor Interface) 層來連線到Tuxedo。相應的,ATMI介面來控制資訊互動、事務處理、資料緩衝區管理等功能。

  根據XMLink在前圖的J2C聯結器架構中所處的位置,我們把它進一步細化,如下圖所示:

  圖2 XMLink體系結構示意圖


  如上圖所示,XMLink可以實現以下操作:

  •   1. XMLink是一個J2EE/JCX實現。通過它的Tuxedo介面卡,將J2EE呼叫行為轉換成為Tuxedo API呼叫行為。
  •   2. XMLink的介面卡層處於J2EE/JCX和Tuxedo之間。該介面卡層的職責是將Java輸入流轉換成Tuxedo本地緩衝區的流(反之亦然),並且通過Tuxedo的連結池進行相應呼叫。
  •   3. XML parser驗證從客戶端提交Java流並轉換成為XML流,同時也驗證反向的XML流並轉換成為Java流。

  XMLink提供了一個無狀態會話Bean的元件,它可以讀取外部的XML格式的配置檔案,從而實現指定的使用者業務服務呼叫。

  二、XMLink Wrapper整體架構設計

  XMLink Wrapper處於使用者的DataBean和XMLink之間,一方面,它封裝了XMLink的絕大部分功能,簡化了使用者的呼叫介面;另一方面,它使用統一的配置檔案來管理Tuxedo以及XMLink相關的環境設定,從而當Tuxedo端或XMLink端發生變更時,客戶端可以不用做任何修改也能夠很好地執行。下圖表示XMLink Wrapper與其他模組之間的關係。

  圖3 XMLink Wrapper與其它模組的聯絡


  XMLink Wrapper包含三個部分:

  •   1、Schema生成器:Schema Generator
  •   2、資料轉換器:Data Exchanger
  •   3、XMLink功能呼叫包裝器:XMLink Tool
它們在XMLink Wrapper中的位置如下圖所示:

圖4 XMLink Wrapper總體結構圖



下面分別予以介紹:

Schema生成器(Schema Generator):在XMLink Wrapper中有一個Schema生成器,它能夠從Tuxedo的Field Table File (*.fld檔案,定義FML/FML32欄位資訊)生成格式定義良好的XML Schema。然後,通過利用XMLBeans,我們又能夠從XML Schema檔案生成FML/FML32欄位資訊的物件模型,這些物件模型在使用者看來就是一些普通的Java Bean。整個過程如下圖所示:

圖5 使用Schema Generator和XMLBeans來生成FML/FML32資料對應的物件模型



資料轉換器(Data Exchanger):XMLink Wrapper中包含一個資料轉換器。一方面,我們在呼叫XMLink相關功能之前,需要使用Data Exchanger for Input將FML/FML32資料對應的物件模型轉換成XMLink能夠識別的資料格式(XMLink XML Call Input Data Format);另一方面,我們在得到XMLink返回的輸出資料(XMLink XML Call Output Data Format)之後,需要使用Data Exchanger for Output將其轉化成為使用者能夠讀懂的FML/FML32資料對應的物件模型。整個過程的流程如下圖所示:

圖6 使用Data Exchanger來進行FML/FML32資料物件模型與XMLink XML Call Data之間的轉換


XMLink功能呼叫包裝器(XMLink Tool):XMLink Wrapper中包含一個XMLink功能呼叫包裝器。該包裝器能夠讀取XMLink配置檔案中的相關資訊,判斷出XMLink的安裝環境,然後使用該環境下對應的XMLink的介面來呼叫Tuxedo服務。

圖7 封裝兩種型別的XMLink安裝方式,使其在使用者看來都是透明的

三、 幾種XMLink 開發模式的對比

1、未封裝前的XMLink的開發模式

XMLink預設的開發模式包括以下幾個步驟:

1)初始化連線池
2)建立Tuxedo連線
3)建立一個和Tuxedo服務互動的例項
4)建立一個互動例項的配置屬性物件
5)設定呼叫的Tuxedo服務名
6)設定呼叫方式:1-同步/0-非同步
7)設定超時時間-毫秒
8)定義記錄工廠--緩衝區
9)定義輸入、輸出引數
10)往緩衝區壓入業務輸入引數
11)呼叫Tuxedo服務,得到輸出結果
12)調整輸出結果的字符集格式
13)關閉與Tuxedo服務互動的例項
14)關閉Tuxedo連線

其例項程式碼如下:

程式碼:/**初始化連線池**/ Context initctx = new InitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) initctx.lookup("jca/xmlink"); /**建立連線**/ Connection conn = connectionFactory.getConnection(); /**建立一個和tuxedo服務互動的例項**/ Interaction interaction = conn.createInteraction(); /**建立一個互動例項的配置屬性物件**/ TuxInteractionSpec tux1 = new TuxInteractionSpec(); /**設定呼叫的tuxedo服務名**/ tux1.setFunctionName("GETDETAIL"); /**設定呼叫方式:1-同步/0-非同步**/ tux1.setInteractionVerb(1); /**設定超時時間-毫秒**/ tux1.setExecutionTimeout(300); /**定義記錄工廠--緩衝區**/ RecordFactoryImpl rdf = (RecordFactoryImpl) connectionFactory.getRecordFactory(); /**定義輸入、輸出引數**/ /**定義傳輸型別為FML32型別**/ FML32Record rc = (FML32Record) rdf.createMappedRecord("FML32"); /**往緩衝區壓入業務輸入引數*/ rc.addIn("COUNT",count); rc.addIn("SATIME",satime); /**獲取輸出結果*/ System.out.println("step 1......"); FML32Record ret = (FML32Record) interaction.execute(tux1, rc); System.out.println("step 2......"); /**中文字符集轉換*/ ret.setEncoding("GB2312"); ret.processOutput(0); System.out.println("返回引數個數為:" + ret.size()); System.out.println("使用者姓名:" + ret.getField("USRNAME").get(0)); System.out.println("使用者卡號:" + ret.getField("COUNT").get(0)); System.out.println("使用者存款記錄:"); /*取得使用者所有存款記錄*/ Iterator it = ret.getField("SAID").listIterator(); Iterator it1 = ret.getField("SAADDR").listIterator(); Iterator it2 = ret.getField("SATIME").listIterator(); List all=new ArrayList(); while(it.hasNext()) { Sale use=new Sale(); use.setSaid((String)(it.next())); use.setSaaddr((String)(it1.next())); use.setSatime((String)(it2.next())); all.add(use); } interaction.close(); conn.close();

2、經過第一級封裝後的XMLink的開發模式(使用Schema Generator 和XMLink Tool之後的開發模式)
經過第一級封裝以後,我們把Tuxedo服務呼叫相關的配置資訊放到配置檔案中,而客戶端僅僅需要以下幾行程式碼就能完成上面程式碼的類似功能:

程式碼:                        /**指定呼叫的Tuxedo服務名:GETDETAIL*/
TranInDataBean ccx = new TranInDataBean("GETDETAIL");

/**壓入輸入引數:COUNT,1*/
                        ccx.setField("COUNT", "1");

                        /**壓入輸入引數:SATIME,2001/03/19*/
                        ccx.setField("SATIME", "2001/03/19");

                        /*呼叫Tuxedo服務,得到服務結果*/
TranOutDataBean ut = dd.callSyncService(ccx);

/*從服務結果讀取所需資料*/
List flds=out.getFields();
                        for (int i = 0; i < flds.size(); i++)
                        {
                                CommonField cf=(CommonField)flds.get(i);
                                String fldName = cf.getFldName();
                                String fldValue =cf.getFldValue();
                                System.out.println(
                                        "fldName:" + fldName + "\t" + "fldValue:" + fldValue);
}

我們定義的配置檔案callprops.properties格式如下:

程式碼:#calltype:0表示容器環境,無須配置其他屬性;1表示非容器環境,需要配置其他屬性
calltype=1

#calltype=0時需要配置的其他屬性如下:
namecontxtfac=com.ibm.websphere.naming.WsnInitialContextFactory
contxturl=iiop://localhost:2809
xmlinkjndi=jca/xmlink

#calltype=1時需要配置的其他屬性如下:
WSNADDR=//192.168.102.1:7898
TUXCONFIG=D:\\simpappFML\\tuxconfig
FLDTBLDIR=
FLDTBLDIR32=D:\\simpappFML
FIELDTBLS=
FIELDTBLS32=user.fld

3、經過第二級封裝後的XMLink的開發模式(使用Schema Generator ,XMLink Tool和Data Exchanger之後的開發模式)
第二級封裝是在第一級封裝的基礎上再加上使用者資料轉換器Data Exchanger。Data Exchanger允許使用者可以以更加直觀的方式處理將要壓入FML/FML32緩衝區的資料以及將要從FML/FML32緩衝區讀出的資料。其使用效果圖如下:


使用第二級封裝後,XMLink的程式設計模式如下:

程式碼:OBJLISTDocument d = OBJLISTDocument.Factory.newInstance();
                OBJLISTDocument.OBJLIST bj = od.addNewOBJLIST();
                /*設定Tuxedo服務名*/
                obj.setService("GETDETAIL");

                /*增加新的COUNT欄位值*/
Fldtype ft = obj.addNewCOUNT();       
                ft.setStringValue("2");       

                /*增加新的SATIME欄位值*/
ft = obj.addNewSATIME();
                ft.setStringValue("2001/03/19");               

                /*將使用者可以識別的DataBean轉化為Tuxedo可以識別的Bean*/
                TranInDataBean ccx = AutoFormat.xmlTransIn(od);

                /*呼叫Tuxedo服務*/
                String input = ccx.getDocumentString();
                String utput = CallTuxService.getXmlinkService(input);

/*從Tuxedo服務結果抽取自己所需的資料,這裡是USRNAME*/               
Document doc = AutoFormat.xmlTransOut(output);
                XmlOptions xo = new XmlOptions();
                Map ns = new HashMap();
                ns.put("", "http://xmlbeans.lan.org/myuser");
                xo.setLoadSubstituteNamespaces(ns);
                OBJLISTDocument obj1 = OBJLISTDocument.Factory.parse(doc, xo);               
                System.out.println(obj1.getOBJLIST().getUSRNAME().getStringValue());
四、 總結

如何在J2EE架構下整合Tuxedo應用是一個很值得關注的話題。XMLink是一個遵循J2C標準的、效能良好Tuxedo介面卡。然而它配置複雜,封裝層次太低,因此我們有必要開發自己的包裝器來對其進行封裝。使用XMLink Wrapper之後,我們既簡化了使用者介面,又實現了使用者應用程式與XMLink的鬆散耦合,從而達到了執行時可變更配置的目的,提升了系統的靈活性。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14789789/viewspace-374505/,如需轉載,請註明出處,否則將追究法律責任。

相關文章