WebSphere和Tuxedo Server整合方案1
引言
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介面來控制資訊互動、事務處理、資料緩衝區管理等功能。
圖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
圖4 XMLink Wrapper總體結構圖
![](https://i.iter01.com/images/2b2a1cf75bf61309fd0f0ae64a0543cbbb4b644b4381b8813fd5a7d1551b63c4.gif)
下面分別予以介紹:
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資料對應的物件模型
![](https://i.iter01.com/images/7f2d7b08fee3b1c11814ca3a74893a6b919df4582597e4ba57fbc05f4edadf81.gif)
資料轉換器(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之間的轉換
![](https://i.iter01.com/images/bcd0d7b85e87507de71de95ea3333dc9362485e6b45014a6dec28b39584b35e5.gif)
XMLink功能呼叫包裝器(XMLink Tool):XMLink Wrapper中包含一個XMLink功能呼叫包裝器。該包裝器能夠讀取XMLink配置檔案中的相關資訊,判斷出XMLink的安裝環境,然後使用該環境下對應的XMLink的介面來呼叫Tuxedo服務。
圖7 封裝兩種型別的XMLink安裝方式,使其在使用者看來都是透明的
![](https://i.iter01.com/images/62f4977dfb6e93177cbef0c50d9ef5aae0c7df4de815e9e47c76dd52cd397174.gif)
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緩衝區讀出的資料。其使用效果圖如下:
![](https://i.iter01.com/images/b4263be8f3bb1f4e2f8b47723221656c8041685ce60fe361ffeb2b7874a52f50.jpg)
使用第二級封裝後,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TUXEDO超時控制全功略(zt)UX
- Spring Boot 整合 MyBatis和 SQL Server實踐Spring BootMyBatisSQLServer
- WebSphere和DB2效能問題的發現和處理KPWebDB2
- WebSphere配置https協議訪問WebHTTP協議
- websphere 受管節點問題Web
- WebSphere 叢集建立及故障排除Web
- SQL Server中count(*)和Count(1)的區別SQLServer
- Spring 4.2.2以上版本和swagger整合方案和踩過的坑SpringSwagger
- SAP CRM和Twitter以及facebook的社交媒體整合方案
- grpc python 原始碼分析(1):server 的建立和啟動RPCPython原始碼Server
- 前端整合解決方案前端
- 使用 Xcode Server 持續整合 & 打包測試XCodeServer
- 優雅的快取解決方案--SpringCache和Redis整合(SpringBoot)快取GCRedisSpring Boot
- All in one入門之All in one和三種PVE、ESXI、Windows Server方案WindowsServer
- .Net單元測試xUnit和整合測試指南(1)
- WebSphere Portal 7.0的主題與皮膚部署方法Web
- 金蝶雲星空和管易雲的高效資料整合方案揭秘
- MSSQL Server 遷移至 ORACLE解決方案SQLServerOracle
- [Flink/CDC/資料整合] 資料增量整合方案:Flink CDC
- 企業如何資料整合?資料整合解決方案
- 小程式的持續整合方案
- allure 報告整合方案請教
- 應用系統整合方案(一)
- 應用系統整合方案(二)
- 應用系統整合方案(三)
- 簡單的mock-server 解決方案MockServer
- SQL Server查詢慢的解決方案SQLServer
- MSSQL server分散式事務解決方案SQLServer分散式
- Tungsten Fabric解決方案指南-Kubernetes整合
- 持續整合質量保證方案
- HTTP 錯誤 500.21 - Internal Server Error 解決方案HTTPServerError
- 從ESB匯流排到iPaaS整合平臺,如何選擇整合方案
- 整合JavaFX和SwingJava
- 如何使用 Helm 在 K8s 上整合 Prometheus 和 Grafana|Part 1K8SPrometheusGrafana
- LLC磁整合變壓器方案設計
- ASP.NET Core3.1使用Identity Server4建立Authorization Server-1ASP.NETIDEServer
- 攻擊JavaWeb應用[7]-Server篇[1]JavaWebServer
- Azure 實踐(1)- Azure Devops Server 安裝devServer
- SQL Server 2008 R2雙機熱備方案SQLServer