Tuxedo 替代方案

2009-01-01

遙想多年前幾個活躍於政府標案的學術界評審,鼓吹 OLTP 重要及必要性,給了 Tuxedo 產品在台灣政府部門立足之地。Tuxedo 是一個不錯的產品,給後來的應用系統服務器〈Application Server〉產品規範了許多 “必需具備" 的功能,對資訊工程發展貢獻良多。因為採取產品而非開放科技導向方案,自然這些單位長期被少數廠商 “獨家” 服務許多年,失去許多科技自主的機會。

從用戶應用系統整體發展觀點,而非以 Tuxedo 廠商產品銷售為觀點,則有以下幾點考量:

至於是否要採取瀑布式全面實施企業流程再造〈Business Process Re-Engineering〉, 實在是一個難以抉擇的決定。然而就專案實施風險考量,想要發動一場 “革命聖戰" 要畢其功於一役,實在是需要勇氣與賭運。替代 Tuxedo 機制,保有現有應用系統投資;而新系統則直接在 SOA 環境下開發,透過 Portal 與 BPM 調用批次作業 C 及 COBOL 系統似乎最為可行。

然而要如何移轉既有以 Tuxedo 為核心龐大的應用系統呢?尤其這些應用系統多半是由 C 及 COBOL 語言開發的,也造成一些移轉技術困難。
因為不實施企業流程再造,那麼現有 C 及 COBOL 程式修改程度就必須要最小。

首先觀察 Tuxedo 應用系統範例程式寫法如下,包括:

  • 服務請求〈Client/Echo.c〉程式與服務者〈Server/EchoService.c〉。
  • 服務請求程式自其執行命令列〈Command Line〉獲取字串當做服務請求參數,填入服務請求緩衝區〈Request Buffer〉。
  • 服務者程式自 Tuxedo 機制中獲取字串,並將參數餵入處理〈Process〉,產生結果填入返回結果緩衝區〈Reply Buffer〉,再由 Tuxedo 機制將結果緩衝區返回給服務請求程式。
Tuxedo 範例程式
服務請求程式:Echo.c

/* Echo.c */
/* Tuxedo Client */


#include <stdio.h>
#include <string.h>


#include "atmi.h"

int main(int argc, char *argv[]) {
	char *sendbuf, *rcvbuf;
	long sendlen, rcvlen;
	int ret;

	if (argc != 2) {
		(void) fprintf(stderr, "用法: Echo <任何字串>\n");

		exit(1);
	} 

	/* 開啟 Tuxedo 連線 */
	if (tpinit((TPINIT *) NULL) == -1) {
		(void) fprintf(stderr, "Tuxedo 連結失敗\n");

		exit(1);
	}

	sendlen = strlen(argv[1]);

	if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
		(void) fprintf(stderr, "索取參數記憶體失敗\n"); 

		/* 關閉 Tuxedo 連線 */
		tpterm();

		exit(1);
	}

	if ((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
		(void) fprintf(stderr, "索取結果記憶體失敗\n"); 

		/* 釋放記憶體 */
		tpfree(sendbuf); 

		/* 關閉 Tuxedo 連線 */
		tpterm();

		exit(1);
	}

	(void) strcpy(sendbuf, argv[1]); 

	/* 調用 Tuxedo 服務: ECHO */

	ret = tpcall("ECHO", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);

	if (ret == -1) {
		(void) fprintf(stderr, "服務: %s 調用失敗\n", "ECHO");
		(void) fprintf(stderr, "錯誤碼: %d\n", tperrno); 

		/* 釋放記憶體 */
		tpfree(sendbuf);
		tpfree(rcvbuf); 

		/* 關閉 Tuxedo 連線 */
		tpterm();

		exit(1);
	}

	(void) fprintf(stdout, "返回字串: %s\n", rcvbuf); 

	/* 釋放記憶體 */
	tpfree(sendbuf);
	tpfree(rcvbuf); 

	/* 關閉 Tuxedo 連線 */
	tpterm();

	return(0);
}
服務者:EchoService.c
/* EchoService.c */
/* Tuxedo Server */

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include <atmi.h>
#include <userlog.h>

int _argc = -1;
char **_argv = NULL; 

/* 服務啟動時 */
int tpsvrinit(int argc, char *argv[]) { 

	/* 初始環境 */
	_argc = argc;
	_argv = argv; 

	/* Tuxedo 系統日誌 */
	userlog("ECHO 服務已啟動");

	return(0);
} 

/* 服務啟動後 */
void ECHO(TPSVCINFO *rqst) {
	int i;

	for (i=0; i < rqst->len-1; i++)
		rqst->data[i] = toupper(rqst->data[i]); 

	/* 返回結果記憶體 */
	tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
} 

/* 服務終止後 */
void tpsvrdone() {
	/* 環境終止 */
	_argc = -1;
	_argv = NULL; 

	/* Tuxedo 系統日誌 */
	userlog("ECHO 服務已終止");

	return(0);
}
Tuxedo 應用程式建置及運行示意圖
Tuxedo
 
 

對 C/C++ Tuxedo 程式,解決之道如下:

  • 選擇具備支持 ANSI 之 C/C++ 編譯器。
  • 觀察現有 C/C++ Tuxedo 程式使用那些 Tuxedo API,開發替代程式庫。
  • 替代程式庫採用 C/C++ 語言開發。
  • 透過替代 Tuxedo Shared Library 方式,在 Shell 中指定 LD_LIBRARY_PATH 換成新程式庫。

對 COBOL Tuxedo 程式,解決之道如下:

  • 選擇具備支持 ANSI C/C++ 擴充能力之 COBOL 編譯器。
  • 觀察現有 COBOL 程式使用那些 Tuxedo API,開發替代程式庫.
  • 替代程式庫採用 C/C++ 語言開發。
  • 透過替代 Tuxedo Shared Library 方式,在 Shell 中指定 LD_LIBRARY_PATH 換成新程式庫。

有基本想法之後,剩下問題是如何取代 Tuxedo 機制,且要符合服務導向架構,可以採用下列方式:
  • EJB 方式
    • 服務請求程式:
      • 透過應用系統服務器客戶端程式框架,封裝 Tuxedo API〈tpinit/tpterm〉 與應用系統服務器溝通。
      • 遠程調用 EJB 服務,讀取返回值〈Tuxedo API:tpcall〉。
      • 將請求緩衝區序列化〈Serialization〉後調用。
      • 將返回值反序列化〈De-Serialization〉後應用。
    • 服務者程式:
      • EJB 程式透過 JNI 調用原 C 及 COBOL 服務程式
      • 將請求緩衝區反序列化〈De-Serialization〉後應用
      • 資料處理後將結果緩衝區序列化〈Serialization〉返回
  • Servlet 方式
    • 服務請求程式:
      • 透過應用系統服務器客戶端程式框架,封裝 Tuxedo API 與應用系統服務器溝通。
      • 調用 HTTP 程式庫〈Tuxedo API:tpinit/tpterm〉。
      • 使用 POST 調用服務,讀取返回值〈Tuxedo API:tpcall〉。
      • 將請求緩衝區序列化〈Serialization〉後 POST。
      • 將返回值反序列化〈De-Serialization〉後應用。
    • 服務者程式:
      • Servlet 程式透過 JNI 調用原 C 及 COBOL 服務程式
      • 將請求緩衝區反序列化〈De-Serialization〉後應用
      • 資料處理後將結果緩衝區序列化〈Serialization〉返回

由於 Tuxedo 用戶通常建置時日久遠,許多應用系統設計文件不是付之闕如,就是未曾更新與現況不符。因此在實施 Tuxedo 應用系統移轉時,應實施 Tuxedo 應用系統普查與分類:

  • 服務請求程式一覽表:建立移轉清單
  • 服務者程式一覽表:建立移轉清單
  • 服務請求程式服務調用對照表:找出服務者程式被哪些>服務請求程式調用,建立移轉順序。
  • 服務請求程式資源需求表〈如:檔案 資料庫 等〉:規劃檔案目錄與相應權限檔案,建立資料表格相應之 Entity Bean。
  • 服務者程式資源需求表〈如:檔案 資料庫 等〉:規劃檔案目錄與相應權限檔案,建立資料表格相應之 Entity Bean。

對於 Tuxedo 程式所使用之資料庫資源,由於要配合服務導向機制,將要存取之資料表格設計成相應之 Entity Bean。如此一來,無論是來自入口網 Portlet 之調用,還是來自商業流程或內容管理引擎之調用,均能以一致方式存取資料表格,同時也能在新應用中調用來自服務導向機制其他之 Entity Bean。

廣告
%d 位部落客按了讚: