bea tuxedo中间件入门
 
§? TUXEDO是什么?
l? 客戶端/服務器模式的演化
l? 基本的客戶端/服務器模式
l? 多層結構
l? TUXEDO的客戶端/服務器方法
l? 一個完整的例子
l? 應用配置文件:ubbconfig
l? 運行應用的步驟
 
tuxedo是什么?
?????? BEA TUXEDO是在企業、Internet 這樣的分布式運算環境中開發和管理三層結構的客 戶/服務器型關鍵任務應用系統的強有力工具。它具備分布式事務處理和應用通信功能,并提供完善的各種服務來建立、運行和管理關鍵任務應用系統。開發人員能夠用它建立跨多個硬件平臺、數據庫和操作系統的可互操作的應用系統。BEA TUXEDO是企業、 Internet 分布式應用中的基礎主干平臺。它提供了一個開放的環境,支持各種各樣的客戶、數據庫、網絡、遺留系統和通訊方式。
 
特點:
2? 大量在線用戶
2? 巨量數據
2? 信息訪問
2? 小事務
2? 復雜網絡
?
C/S系統的層次結構
以下列出了分布式系統的主要層次:
2? 用戶界面:被分成表示管理和表示邏輯。代表有主機框架的3270仿真終端;UNIX系統的X終端等,最新的Web瀏覽器界面也是。
2? 商業邏輯:包含應用邏輯和應用規則。
2? 數據管理:分為數據訪問邏輯(SQL)和數據庫管理。
區分C/S結構的類型可以根據以下特性:
客戶端和服務端程序間邏輯分布,如何實現層次功能;中間件產品及技術的使用。
?
C/S模式的演化
????? 上圖列舉了不同種類的C/S模式。其中大型主機系統仍然統治著最大的OLTP應用;基于X終端和UNIX工作站的應用在80年代后期興起;廉價的WINTEL機器支持的Windows GUI通常用于2層模式;數據庫新技術和OSF帶領了3層應用模式。
?
基本C/S模式
?????? C/S系統是一種分布式系統,由其程序決定其特點:
2? 客戶端部分執行前端功能,如:提供用戶界面,向后臺發出用戶請求的交易,將結果返回給用戶。
2? 服務提供一般后端功能,按交易組織,將結果返回前端。
2? 交易是分散的,按需求的操作,可以被遠程客戶端訪問的程序。
C/S模式可能會有如下優點:
2? 減小客戶端程序體積,提高反應速度
2? 位置無關
2? 模塊化
2? 擴展性好
?
?
可管理多層C/S模式
?
?
?????? 在可管理多層(Managed Multi-Tier –MMT)C/S模式中,提出了中間件管理。在本書范圍內,此點由交易處理(TransactionProcessing –TP)管理完成,提供以下功能:
2? 在客戶端和服務端之間進行通訊和傳輸
2? 提供良好的系統管理
2? 提供交易、配置的分布式管理
它管理服務端從多個客戶端收到的數據流,并不是在C/S間建立一對一的關系,而且客戶端可以向多個服務發出請求。這種特點保證了TUXEDO可以提供強大的分布式交易處理框架。
由于不必進行通訊和交易管理,數據庫引擎可以專注于其特長:管理數據!在這種情況下,數據庫成了一個純RM(Resource Manager)。
?
MMT C/S模式給OLTP應用增加了如下優點:
2? 所有C/S模式的優點在MMT模式下都得到了增強。實際上,由于中間件的引入,處理能力得到改善。
2? 由于中間件管理了數據流,帶來了許多新功能,如:交易路由、服務分布、管道、數據依賴路由等成為可能。
2? 統一的數據流控限制了最大交易數,總的數據庫過程少了,服務器空閑時間也少了,這就增加了數據庫和系統效率。
2? 應用代碼的設計可以不考慮物理地址和內部數據表示。
2? 配置成了一件單純的管理工作,進一步的,可以通過配置輕易的改變系統結構。服務可以動態的增加、刪除和重啟動。
?
TUXEDO的C/S方案
?????? 構成TUXEDO系統的各部分、工具和其特性組成的MMT C/S模式給應用帶來的便利及TUXEDO的實現方法:
| MMT C/S模式的優點 | TUXEDO的實現技術 | 
| 模塊化 | 客戶端,交易,服務 | 
| 最大化的處理能力和流量 | 客戶端交易流量控制,分布式配置,快速消息匹配和路由 | 
| 通訊傳輸技術 | ATMI訪問,一種簡單且容易定義的接口 | 
| 實時應用管理 | 核心配置文件,MIB,管理工具和基于瀏覽器界面的GAI | 
| 名字服務和交易位置無關 | 公告牌提供目錄交易便利 | 
| 應用數據服務 | 應用服務位置可以在配置中隨意配置 | 
?
?
TUXEDO系統的特點
?
2? TUXEDO /T
n? 管理C/S數據流
n? 支持3層結構
n? 多平臺支持
n? 協同(BEAConnect, /TxRPC, /OSITP)
n? 開發
u? 通訊手段
l? 同步
l? 異步
l? 會話
l? 廣播通知
l? 管道
l? 事件訂閱
u? 緩沖數據類型(自動編、解碼)
u? 事務
n? 管理
u? 核心配置管理
u? 管理信息庫(MIB)
u? Web界面管理接口
u? 負載平衡
u? 網絡配置
u? 安全
u? 數據依賴路由
u? 數據壓縮
2? BEA JOLT 將TUXEDO中間件框架擴展到Internet和Java客戶端
2? TUXEDO /Q
n? 通訊保障
n? 預定處理
2? TUXEDO /WS
n? 多平臺支持
n? 把BEATUXEDO ATMI API擴展到客戶應用程序中
2? TUXEDO /Domains
2? TUXEDO /COBOL
?
一個例子
? 一個TUXEDO 應用可以分成3部分
2? 發布交易請求的客戶端
2? 運行響應請求交易的服務
2? 描述應用機器和服務信息的配置文件
上圖是本例的示意圖:
?????? 客戶端請求交易“TOUPPER”,數據是“hello world”。交易“TOUPPER”將字符串轉成大寫,將結果成功返回客戶端。
?
客戶端范例
#include <stdio.h>
#include “atmi.h”
main()
{
?????? char????? *buf;
?????? long????? len;
?????? if? (tpinit((TPINIT * )NULL) == -1)
?????? {
????????????? exit(1);
?????? }
?????? if((buf=tpalloc(“STRING”,NULL,80))==NULL)
?????? {
????????????? tpterm();
????????????? exit(2);
?????? }
?????? strcpy(buf, “helloworld”);
?????? if (tpalloc(“TOUPPER”,buf,0,&buf,&len,0)== -1)
?????? {
????????????? fprintf(stderr,”servicerequst fail\n”);
????????????? tpfree(buf);
????????????? tpterm();
????????????? exit(3);
?????? }
?????? printf(“return string is:%s\n”,buf);
?????? tpfree(buf);
?????? tpterm();
?????? exit(0);
}
包含TUXEDO系統的頭文件”atmi.h”,以便引用TUXEDO的函數和變量定義。
客戶端調用tpinit()連接應用
用tpalloc()分配一個STRING類型數據緩沖
將”helloworld”拷貝進緩沖
用tpcall()包含數據緩沖,向交易“TOUPPER”發一個同步請求
打印出改變的數據緩沖
調用tpterm()切斷與應用的連接
?
?
交易范例
#include <stdio.h>
#include <ctype.h>
#include “atmi.h”
void TOUPPER (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);
}
包含TUXEDO系統頭文件”atmi.h”
象所有的TUXEDO交易函數一樣,TOUPPER不用直接返回任何值,所以返回類型為void
從客戶端收到的數據放在TPSVCINFO結構中,是唯一的入參
交易處理…
用tpreturn()將數據緩沖返回客戶端
?
配置文件
?????? 有關應用的信息,如可用交易,交易位置,應用范圍等,有必要集中管理于單一資源。事實上,這些信息被集中于文件UBBCONFIG。該文件分7節,主要部分內容描述如下:
*RESOURCES節包含全局信息,如:標識公告牌位置的唯一鍵值(IPCKEY),主控節點的名字(MASTER),應用類型(MODEL),下文例子中設為SHM表示是一個單節點應用。
*MACHINES節包含節點信息,如:機器物理名,TUXEDO系統位置(TUXDIR),服務碼位置(APPDIR),以及本文件的二進制碼文件名(TUXCONFIG)。
*GROUPS節包含一些管理用信息,如設定服務或交易的分布式事務處理。
*SERVERS節包含需要啟動的交易和其組信息等其他信息。
*SERVICES節包含影響應用操作方式的的必要信息。本節列出的交易都是需要特別配置的,如有特別的優先級,裝入參數,數據依賴路由等。
配置文件范例
#file : ubbconfig
*RESOURCES
IPCKEY??????????????????? 5000
MASTER?????????? SITE1
MODEL????????????? SHM
*MACHINES
gumby??????????????? LMID=SITE1
TUXDIR???????????? =”/usr/tuxedo”
APPDIR??????????????????? =”/usr/apps/simpapp”
TUXCONFIG???? =”/usr/apps/simpapp/simpapp.tux”
*GROUPS
GROUP1?????????? LMID=SITE1???? GRPNO=1
*SERVERS
simpserv?????????????????? SRVGRP=GROUP1????? SRVID=1
*SERVICES
TOUPPER
?
建立應用
?????? 建立一個TUXEDO應用,必須進行以下步驟:
2? 設置環境變量。
TUXDIR表示TUXEDO用戶目錄;TUXCONFIG是二進制配置文件名;在路徑中加入TUXEDO的可執行文件路徑;如果用到公共庫,還必須包含LD_LIBRARY_PATH,指出公共庫位置。
TUXDIR=/usr/tuxedo
PATH=$PATH:$TUXDIR/bin
TUXCONFIG=/usr/apps/simpapp/simpapp.tux
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
export LD_LIBRARY_PATH PATH TUXDIR
2? 用buildclient命令從源程序編譯出客戶端可執行文件。
buildclient –f client.c –o client -v
2? 用buildserver命令從源程序編譯出服務端可執行文件。-s參數列出提供的交易。
Buildserver –f simpserv.c –o simpserv –s TOUPPER -v
2? 用tmloadcf命令從文本配置文件ubbconfig生成二進制配置文件tuxconfig。
Tmloadcf –y ubbconfig
?
開發TUXEDO C/S系統的必要步驟
2? 配置環境變量
2? 編碼并編譯客戶端和服務端的程序
2? 由文本的ubbconfig生成二進制TUXCONFIG
2? 啟動系統和服務
2? 測試應用
2? 關閉系統
?
?
小結
l? 客戶端/服務器模式的演化
l? 用TUXEDO管理多層客戶端/服務器模式
l? 一個簡單應用:simpapp
?
?
?
客戶端開發??? Client Development
本節要點
l? 客戶端在客戶端/服務器模式中的作用
l? 開發客戶端的過程
l? 查找錯誤
tperrno,tperrordetail
tpstrerror(),tpstrerrordetail()
userlog()
l? 使用ATMI
進程管理
緩沖管理
請求/響應通訊
l? 建立并編譯一個TUXEDO客戶端應用
buildclient
客戶端在C/S模式中的作用
?
?
?????? 為了更好的了解客戶端的所有任務以編寫客戶端應用,有必要重新認識客戶端在C/S模式中扮演的角色。
?????? 首先,客戶端是用戶界面。意思是當用戶在系統上用程序進行一次操作的整個過程就是一個客戶端過程。前端過程是對客戶端的另一個描述。客戶端的首要任務就是獲得執行操作應該得到的數據。
?????? 一旦客戶端得到了應有的信息,應該將數據按服務能夠識別并適合傳輸的格式打包。
?????? 然后,向服務端發送請求并等待回應。
?????? 收到回應數據后,將其按一定格式返回給終端用戶。
?
??????????????????????????????????????????????????????????
?
?
?
?
客戶端開發過程
?????? 客戶端程序的設計和實現可以被分成2部分考慮:
2?用戶處理過程
2?TUXEDO功能部分
下文的客戶端程序只描述了TUXEDO功能部分。
利用TUXEDO的ATMI API調用可以做到:
——基本的TUXEDO調試技巧(tperrno,tpstrerror,userlog)
——TUXEDO進程管理(tpinit,tpterm)
——基本數據緩沖管理(tpalloc,tprealloc,tpfree)
——基本通訊(tpcall,tpacall,tpgetrply)
?
調試和錯誤處理
?
?????? 當調用ATMI出錯時,返回值為-1,全程變量tperrno被設值,該變量提供系統定義的出錯原因。函數tpstrerror()以此變量為參數,返回錯誤的字符說明信息。
?????? 完整的錯誤號和文本錯誤信息存在于文件$TUXDIR/include/atmi.h。
?????? 函數userlog()重定向輸出文件為ULOG.mmddyy。使用方法同printf()。該函數每次輸出都寫硬盤,這樣在系統失敗時也能保留調試信息。
?
代碼范例
?
main()
{
int?? ret;
?
ret = [a ATMI call]
if ( ret == -1 )
{
?????? printf(“Errorin ATMI call\n”);
?????? usrlog(“ATMIerror logged %d %s”,tperrno,tpstrerror(tperrno));
}else
?????? printf(“ATMIcall OK\n”);
?
……
?
ret = tpterm();
if ( ret == -1 )
{
?????? printf(“Errorin exiting application\n”);
?????? usrlog(“ATMIerror logged %d %s”,tperrno,tpstrerror(tperrno));
}
?
}
?
?
?
tperrno – 全程變量
(char *)tpstrerror(int)
userlog(…) – 語法同printf()
ULOG.mmddyy – 日志文件
?
?
?
?
?
進程管理
?
?????? 為了使客戶端能夠訪問TUXEDO交易,客戶端程序必須連接TUXEDO應用并進行登記。這種管理性步驟在切斷連接時也要類似執行一次。API如下:
?
inttpinit(TPINIT *tpinfo)
?
客戶端通過調用tpinit()與應用連接,進行交互,有以下事件發生:
調用安全接口檢查客戶端是否需要認證
連接BB,使進一步的ATMI函數得到信息
使BBL了解BB中已經存在請求
建立客戶端消息隊列使服務可以發回返回信息,系統可以送出廣播通知等
?
錯誤時返回-1,可能由以下原因引起:
2? TPEINVAL???????? 參數錯誤
2? TPENOENT????? BB無空間
2? TPEPERM???????? 無連接權限
2? TPEPROTO????? 協議錯誤 – 被服務調用
?
inttpterm()
?
客戶端調用tpterm()切斷與應用的連接,結束了客戶端的TUXEDO進程,該過程發生以下事件:
BB入口刪除,使BBL知道客戶端已經離開
客戶端離開BB,客戶端的信號量被移除
客戶端消息隊列被移除
錯誤時返回-1,可能由以下原因引起:
TPEPROTO????? 協議錯誤 – 被服務調用
TPESYSTEM??? /T系統下錯誤
TPEOS?????????????? 操作系統錯
范例
main()
{
?????? intret;
?????? ret=tpinit((TPINIT*)NULL);
?????? ……
?????? ret=tpterm();
}
?
數據緩沖管理
?????? ATMI提供函數分配(tpalloc(),tprealloc())、釋放(tpfree())TUXEDO數據緩沖。應用負責將應用數據填入緩沖。應用的數據類型和組織決定應該選擇何種數據緩沖。函數type()可以返回正在使用的數據緩沖類型。
?????? 以下是TUXEDO基本的數據緩沖類型:
2?STRING????? 以空值結尾的單域字符數據。
2?CARRAY??? 有長度定義的單域二進制數據,不進行編、解碼。
2?VIEW?????????? 類C結構或COBOL記錄的多域組織。
2?FML???????????? 無固定結構的自定義緩沖。
tpalloc(),tprealloc()在出錯時返回空值,可能由以下原因引起:
2?TPEOS??????? 操作系統
2?TPEINVAL? 非法或不正確的類型
2?TPESYSTEM??? TUXEDO之下的錯誤
?
范例
main()
{
?????? intret;
?????? char*bufptr;
?????? ret= tpinit((TPINIT *)NULL);
?????? if( ret == -1)
?????? {
????????????? printf(“Errorin joining application\n”);
????????????? userlog(“tpiniterror %d %s”,tperrno,tpstrerror(tperrno));
?????? }else
????????????? printf(“tpinitok\n”);
?????? bufptr=tpalloc(“STRING”,NULL,1*1024);
?????? if( bufptr==NULL)
?????? {
????????????? printf(“Errorin allocating buffers \n”);
????????????? userlog(“tpiniterror %d %s”,tperrno,tpstrerror(tperrno));
????????????? tpterm();
????????????? exit(-1);
?????? }
?????? ……
?????? tpfree(bufptr);
?????? ret= tpterm();
?????? if( ret == -1)
?????? {
????????????? printf(“Errorin exiting application\n”);
????????????? userlog(“tptermerror %d %s”,tperrno,tpstrerror(tperrno));
?????? }
}
函數用法
(char *)tpalloc((char *)type,(char*)subtype,long size)
(char *)tprealloc((char *)bufptr,longnewsize)
void tpfree((char *)bufptr)
?
?
?
?
?
?
?
?
?
同步通訊
??????
函數tpcall()有6個參數。如下:
2? 交易名
2? 請求數據緩沖
2? 請求數據緩沖的長度(僅緩沖類型為CARRY時需要)
2? 返回數據緩沖的地址。緩沖大小可以根據收到數據而改變。
2? 返回數據緩沖大小的地址
2? 標志量
標志量可以是以下值:
2? TPNOTRAN????? 如有交易不調用
2? TPNOBLOCK?? 如有阻塞不等待
2? TPNOTIME??????? 愿意等待直到超時
2? TPSIGRSTRT?? 系統中斷信號在TUXEDO完成后再發布
出錯返回-1,錯誤原因如下:
2? TPEINVAL? 參數錯誤
2? TPETRAN? 交易相關錯誤
2? TPETIME??? 超時
?
代碼范例
main()
{
?????? intret;
?????? longlen=0,flags=0;
?????? char*bufptr;
?????? if? (tpinit((TPINIT * )NULL) == -1)
?????? {
????????????? exit(1);
?????? }
?????? if((buf=tpalloc(“STRING”,NULL,801*1024==NULL)
?????? {
????????????? tpterm();
????????????? exit(2);
?????? }
?????? ret= tpcall(“TOUPPER”,bufptr,len,&bufptr,&len,flags);
?????? if(ret == -1)
?????? {
????????????? userlog(“Errorrequesting %d %s”,tperrno,tpstrerror(tperrno));
????????????? tpfree(bufptr);
????????????? exit(-2);
?????? }
?????? tpfree(bufptr);
?????? if(tpterm()==-1)
?????? {
????????????? userlog(“tptermerror %d %s”,tperrno,tpstrerror(tperrno));
?????? }
}
int tpcall((char *)servicename,(char*)bufptr,long length,(char **)bufptr,(long *)length,long flags)
??????
?
異步通訊I tpacall()
ATMI提供2個異步通訊函數
2?tpacall()
2?tpgetrply()
tpacall()有4個參數
2? 交易名
2? 請求數據緩沖
2? 請求數據緩沖的長度(僅緩沖類型為CARRY時需要)
2? 標志量(同tpcall())
返回值是一個非負描述符(句柄),用于其后的tpgetrply()調用。如果tpacall()調用失敗,句柄是-1,錯誤原因設置在tperrno,可能是以下值:
2?TPELIMIT??? 過多未處理的tpacall()
2?TPETIME??? 超時
tpacall()后總跟隨一個tpgetrply(),有4個參數
2? 變量地址,可以傳入tpcall()所得句柄,或另設一個
2? 返回數據緩沖的地址。緩沖大小可以根據收到數據而改變。
2? 返回數據緩沖大小的地址
2? 標志量
標志量的值可以是如下之一:
2?TPGETANY???????????????????? 取第一個返回值,設句柄
2?TPNOCHANGE????????????? 取發送請求的匹配的類型的信息
2?參見tpcall()中的值
返回值0表示成功,-1表示失敗,錯誤原因可能如下:
2? TPEINVAL???????? 參數錯誤
2? TPEOTYPE????????????? 返回數據緩沖類型錯誤
2? TPETIME??? 超時
main()
{
?????? if(tpinit((TPINIT *)NULL)== -1)
????????????? ……
?????? bufptr=tpalloc(“STRING”,NULL,100);
?????? if(bufptr==NULL)
????????????? ……
?????? cd=tpacall(“TOUPPER”,bufptr,len,flags);
?????? if(tpgetrply(&cd,&bufptr,&len,flags)== -1)
????????????? ……
?????? tpfree(bufptr);
?????? if(tpterm()== -1)
????????????? ……
}
inttpacall((char *)service,(char *)bufptr,long len,long flags);
flag:TPNOBLOCK,TPSIGRSTRT,TPNOTIME,TPNOTRAN,TPNOCHANGE,TPGETANY
inttpgetrply((int *)handle,(char **)bufptr,(long *)len, long flags);
flag:TPNOBLOCK,TPSIGRSTRT,TPNOTIME,TPNOTRAN
?
編譯C語言客戶端程序
?????? 當C語言的客戶端程序編碼完后,需要連接正確的庫并編譯。使用buildclient可以使該過程容易一點。該命令引用了C語言編譯器并按正確的次序連接TUXEDO系統的庫。為使用buildclient,應確認客戶端程序包含了”atmi.h”,TUXDIR被設了正確的值。命令語法如下:
buildclient[-v] –o executable –f first-file [-f first-file] [-l last-file]
?????? 此處first-file表示的應該是編譯器可以識別的文件。缺省的編譯器是cc。一般是.c(c源程序),.C(C++源程序),.o(object)或.a(庫)文件。
?????? 參數解釋如下:
-o??? 生成的可執行文件名
-f???? 需要在連接TUXEDO庫之前傳給編譯器的文件名。如有多于一個的文件名,名字應用空格分隔并用引號引起。也可以使用多個-f參數。
-l???? 需要在連接TUXEDO庫之前傳給編譯器的文件名。語法同上。
-v??? 編譯過程顯示。
?
小結
l? 不同的客戶端/服務器模式
l? 用TUXEDO管理多層客戶端/服務器模式
l? 一個簡單應用:simpapp
l? 開發TUXEDO客戶端
?
服務端開發??? Server Development
本節要點
l? 服務的運行流程
l? 返回控制
l? 創建服務
l? 規劃服務的考慮
l? 啟動和關閉
l? 一個服務中的交易可以調用另一個服務中的交易
l? 一個服務可以提供多個交易
l? 發布交易
服務的運行流程
?????? 為了更好的了解服務端的所有任務以編寫服務端應用,有必要重新認識服務端在C/S模式中扮演的角色。
?????? 首先,服務是系統資源的聯系點。例如,一個數據庫服務聯系實際數據庫并對其進行查詢和修改。為有效進行,應建立一個數據庫連接。
?????? 其次,服務必須發布系統內可以訪問的交易,保證客戶端可以知道把請求發往何處。
?????? 以上兩步結束后,服務進入一個循環——接收請求、處理請求并返回結果。接收請求包括進入消息隊列,得到交易請求。處理請求包括檢查請求數據緩沖,運行商業規則和邏輯,可能還包括訪問數據庫和返回結果數據緩沖。
?????? 當系統管理員需要關閉系統,可以通過系統管理工具將關閉系統的消息發給服務。服務完成所有交易,取消交易發布,關閉資源連接然后結束。
?
返回控制
?
?????? 在一般的C程序中,函數通過調用return()將控制返回,函數調用堆棧清空,控制返回調用點。
?????? TUXEDO系統的交易函數必須結束于將回應返回給客戶端或前轉到另一交易。函數tpreturn()用來結束交易將回應數據緩沖發給客戶端。函數tpforward()將交易前轉給另一個交易,由其負責回應原來的客戶端。下圖是tpreturn()的示意圖。
?????? tpreturn()設計來代替常規的return(),結束絕大多數函數。它將回應數據緩沖返回請求的客戶端,控制權返回給服務程序的標準main()(由TUXEDO提供)。
?
?????? tpreturn()使用下列參數:
?
第一個值表示交易是否成功,有3種可能:
2?TPSUCCESS?? 交易完全成功,如果是一個會話,TPEV_SVCSUCC被生成
2?TPFAIL??????? 交易失敗,tperrno將被設成TPESVCFAIL。如果是事務模式,事務被標志成abort-only,如果是會話,TPEV_SVCFAIL被生成。
2?TPEXIT????????????? 與TPFAIL類似,但服務會中斷,如果服務設成可以重啟動,則可以由TUXEDO系統將其重啟動。
第二個值是應用定義返回碼,此處使交易可以發送一個整形代碼到客戶端,給出交易處理結果的詳細信息。該值與/T系統無關,通過全程變量tpurcode送到客戶端程序。
第三個值是回應數據緩沖的的指針
第四個值是回應數據緩沖的長度(僅緩沖類型為CARRY時需要)
第五個值是標志位,通常不用
?
?
初始化和結束服務
?????? tpsvrinit()和tpsvrdone()分別用來啟動和關閉服務。如果應用不提供這兩個函數,可以使用替代函數。tpsvrinit()用tpopen()缺省打開RM連接。tpsvrdone()用tpclose()關閉RM連接。
?????? tpsrvinit()象標準C語言的main()一樣使用參數argc,argv。服務的命令行參數可以傳入該函數,被getopt()解析。該部分的用法參見應用配置部分。本函數出錯時返回-1,成功返回0。
?????? tpsvrdone()無參數,無返回值。
?
創建服務
?
當C語言的交易程序編碼完后,需要連接正確的庫并編譯。使用buildserver可以使該過程容易一點。該命令引用了C語言編譯器并按正確的次序連接TUXEDO系統的庫,連接TUXEDO生成的main()等。buildserver還用-s參數產生合適的交易名/函數名映射表。要使用buildserver,必須先正確設定環境變量TUXDIR,PATH,LD_LIBRARY_PATH。命令語法如下:
buildserver[-v] [–o executable] [-s service2,service3:func] [-f source/object] [-lobject/library file]
例:
buildserver –s DEPOSIT –o TLR –f TLR.o –fappinit.o??
?????? 參數解釋如下:
-o??? 生成的可執行文件名
-f???? 需要在連接TUXEDO庫之前傳給編譯器的文件名。如有多于一個的文件名,名字應用空格分隔并用引號引起。也可以使用多個-f參數。
-l???? 需要在連接TUXEDO庫之前傳給編譯器的文件名。語法同上。
-v??? 編譯過程顯示。
-b??? 指定SHM或MP模式。如無此項,兩種模式都包括;使用此項可以使生成的可執行文件小一點
-r???? 連接此處指出的RM庫。該RM的名字必須含在$TUXDIR/udataobj/RM文件中。
?
?
規劃服務的考慮
?????? 在TUXEDO應用中,必要時服務可以仿客戶端方式工作。例如:一個服務可能需要其他服務提供的交易,而建立一個副本并不太合理;當然,有時這樣做會高效些。這種特性使程序員在多機配置應用邏輯可以改善編碼和執行效率。關于這方面的例子,請參見TUXEDO提供的應用實例bankapp中的TRANSFER交易。
?????? 一般是出于以下考慮,使用此種方式:
2?最好不要使用收到的數據緩沖向其他服務請求,因為該緩沖可能被改變引起錯誤
2?服務中的交易不應調用本服務中的交易,因為容易產生死鎖(僅當設置TPNOREPLY時可以)
2?一個MSSQ集中的服務需要返回時,應有自己的返回隊列;否則會與本集中其他服務沖突。
?
??????
?
數據緩沖管理
數據緩沖管理大部分內容與客戶端相同
與請求數據緩沖不同,傳給交易的數據緩沖可能已經被tpalloc(),tprealloc(),tpfree()函數處理過。
因為傳給交易的請求數據緩沖已經被tpalloc()分配,所以可以tprealloc()。
所有在服務中分配的數據緩沖,在程序結束時必須全部釋放;唯一例外是用在tpreturn()中的返回數據緩沖。
如有剩余數據緩沖沒有釋放,會在每次交易調用時都生成一些,最終耗盡服務器內存。這可以很容易通過監視進程大小發現,它會隨時間增長而加大。
?
仿客戶端的方式
?????? 下圖展示的流程控制表示一個服務仿客戶端方式工作。服務接收客戶端請求,進一步向另一個交易進行請求。后者處理后返回前者,前者繼續進行處理,準備回應數據緩沖,發回客戶端。
此結構不能超過2級!
?
轉發的方式
?????? 下圖展示的流程控制表示交易請求從客戶端來到一個服務,轉發到另一個服務,然后返回客戶端。
?
?
多個交易
?????? 一個商業應用處理可能會需要來自不同數據源的相似信息或功能。
?????? 例如下圖,TUXEDO有多種方式實現:
2?各交易功能分隔在獨立的可執行服務中
因為功能分布在不同的可執行服務中,編譯如下:
buildserver –f read70.c –o read70 –sREAD70
buildserver –f read80.c –o read80 –sREAD80
buildserver –f read90.c –o read90 –sREAD90
2?將不同功能組織在一個可執行服務中,分隔成不同交易
服務程序包含3個交易函數,編譯如下:
buildserver –f read.c –o read –s READ70–s READ80 –s READ90
2?合并各功能成一個交易,使用別名調用
使用TUXEDO的別名功能,使交易以不同名字發布,如:
buildserver –f read.c –o read –sREAD70,READ80,READ90:READ
READ是真正的交易函數,但服務可以接受對READ70,READ80和READ90的請求
?
動態發布
?
?????? 當交易運行時,交易可以用tmadmin在啟動時發布,也可以通過調用ATMI動態發布。交易例程可以通過調用服務發布或取消發布。
tpadvertise()可以被一個服務調用,發布一個交易
tpunadvertise()可以被一個服務調用,取消發布一個交易
tpadvertise()
該函數允許服務為自己動態發布一個交易,參數如下:
2? 被發布的交易名
2? 交易請求處理函數地址
返回值-1表示失敗。
?????? 如果交易已經被同一函數發布,tpadvertise()立即返回成功。
?????? 如果tpadvertise()被一個MSSQ集中的服務調用,交易被發布到該集所有服務上。
?????? 出錯原因包括:
2?TPEMATCH 交易已經被其他函數發布
2?TPELIMIT 可發布交易最大數已經達到,該限制在配置文件中的MAXSERVICES規定
2?TPEINVAL? 有參數為NULL
2?TPEPROTO 協議錯誤(如被客戶端調用)
動態發布范例1
$tmadmin
>advertise AUDIT:doaudit –g SYSGRP –i1
AUDIT發布在組SYSGRP,服務srvid=1
?
動態發布范例2
void Adminservices(TPSVCINFO *transb)
{
?????? /*取時間time*/
?????? if( time>12 midnight && time < 6 a.m.)
?????? {
????????????? if(tpadvertise(“AUDIT”,doaudit) == -1)
????????????? {
???????????????????? userlog(“unableto advertise AUDIT service”);
???????????????????? tpreturn(TPFAIL,0,transb->data,0L,0);
????????????? }
?????? }
}
void doaudit(TPSVCINFO *transb)
{
……
}
?
應用配置ApplicationConfiguration
?
本節要點
l? 應用配置概覽
l? 管理進程
l? 使用IPCS資源
*RESOURCES
*MACHINES
*GROUPS
*SERVERS
*SERVICES
l? 管理命令
應用配置總覽
?
?????? 應用的描述信息配置在系統核心位置,用一個文件描述,通常稱為ubbconfig文件,在主控機器上。整個TUXEDO系統的管理任務可以在一臺機器上完成,在配置中被定為主控節點。
?????? 在運行時,這些信息被裝入一段共享內存(一個IPC資源),稱為公告牌(Bulletin Board—BB);包含有配置中不同機器的信息,在這些機器上運行的服務的信息,這些服務提供的交易的信息以及其他相關信息。
?????? 客戶端在運行時連接公告牌。當客戶端程序調用一個交易,將根據公告牌找到合適的服務隊列。
?????? 所以,公告牌是:
?????? ——供客戶端尋找適當的服務運行一個交易請求
?????? ——包含應用信息:機器,服務,交易,網絡等
?????? ——創建于ubbconfig文件
?????? TUXEDO提供一個管理進程,稱為BBL(Bulletin Board Liaison),包含了一個公告牌的本地拷貝和本地服務器上應用的狀態。
?????? TUXEDO提供的另一個管理進程DBBL(Distinguished Bulletin Board Liaison),用于多服務器配置時。DBBL與BBL協同,保證所有部分的公告牌內容的一致性。
?
配置文件
?????? 任何TUXEDO應用系統的最基本的管理任務,是建立并維護配置文件。該文件通常稱為ubbconfig文件。負責該工作的系統管理員必須很好的了解分布于各臺機器上的應用服務的數據流,消息隊列的構造,資源間的相互關系。ubbconfig文件可視作包含應用啟動信息的容器,需編譯成二進制文件tuxconfig,作為啟動時的參考。
?????? 其內信息包括:
2? 系統范圍信息(*RESOURCES節)
2? 機器信息(*MACHINES節)
2? 組信息(*GROUPS節)
2? 服務信息(*SERVERS節)
2? 交易信息(*SERVICES節)
2? 網絡組信息(*NETGROUPS節)
2? 網絡信息(*NETWORK節)
2? 路由原則信息(*ROUTING節)
當完成了ubbconfig文件后,用tmloadcf命令生成tuxconfig
另一種從ubbconfig生成tuxconfig的方法是使用圖形管理界面(GAI—Graphical Administration Interface)。
?
應用的信息
?
?????? *RESOURCES節包含整個應用范圍的信息。本節必須在配置文件第一節,不可缺少。信息說明如下:
?
參數??????????????????? 意義
?
*RESOURCES *RESOURCES節
IPCKEY???????????? 共享內存id
UID??????????????????????????? TUXEDO管理員用戶id
GID??????????????????????????? TUXEDO管理員用戶id
PERM??????????????? TUXEDO管理員組用戶的權限
MAXACCESSERS 服務端和客戶端的最大進程數
MAXSERVERS?????? ?????? 限制可以啟動服務總數
MAXSERVICES???????????? 限制可以發布交易總數
MASTER????????????????? 指出主控節點的邏輯名,第二個是備份節點
MODEL??????????????????????????? 應用構架,MP表示多機
OPTIONS????????? LAN,MIGRATE表示是一個網絡應用,服務可以移植到替代處理器上
SECURITY?????????????? 安全級別(5個)
AUTHSVC??????????????? 客戶端可以通過交易“AUTHSVC”獲得認證
NOTIFY???????????????????? DIPIN,客戶端通過dip-in收到廣播通知
SYSTEM_ACCESS????? PROTECTED,NO_OVERRIDE,應用代碼不得干擾共享內存
LDBAL????????????????????? 設Y則進行負載平衡
MAXBUF[S]TYPE?? 數據緩沖類型及子類的最大數
SCANUNIT????????????? 內部時間間隔單位,單位是秒
SANITYSCAN? 檢索公告牌的內部時間間隔,單位是SCANUNIT
BLOCKTIME???? 交易超時時間,單位是SCANUNIT
BBLQUERY????? DBBL查詢所有BLL的時間間隔
DBBLWAIT??????? DBBL等待BBL回應的超時時間
MAXCONV??????? 同時最大會話數
?
注意:本處未列出全部參數。這些系統范圍內參數可以被后序節內參數超越。
?
范例
?
*RESOURCES
IPCKEY?????????????????????????? 80952
UID????????????????????????????????????????? 213
GID????????????????????????????????????????? 1
PERM????????????????????????????? 0660????
MAXACCESSERS??????? 150
MAXSERVERS???????????????????? 75
MAXSERVICES??????????????????? 200
MASTER???????????????????????? SITE1,SITE2
MODEL?????????????????????????????????? MP
OPTIONS??????????????????????? LAN,MIGRATE
SECURITY????????????????????? APP_PW
AUTHSVC?????????????????????? AUTHSVC
NOTIFY??????????????????????????? DIPIN
SYSTEM_ACCESS???????????? PROTECTED,NO_OVERRIDE
LDBAL???????????????????????????? Y
MAXBUFTYPE?????????????? 10
MAXBUFSTYPE??????????? 15
SCANUNIT??????????????????????????? 10
SANITYSCAN??????????????? 12
BLOCKTIME?????????????????? 3
BBLQUERY??????????????????? 24
DBBLWAIT????????????????????? 10
MAXCONV????????????????????? 10
?
?
?
?
?
機器信息
?
?????? *MACHINES節包含應用有關的每個處理器的信息。本節必須在*RESOURCES節后列出。
參數??????????????????? 意義
*MACHINES???? MACHINES節
gumby??????????????? 物理處理器名,可以通過”uname –n”或節點名得到
TUXDIR???????????? TUXEDO系統軟件安裝位置
APPDIR???????????? 應用服務位置全路徑
TUXCONFIG???? TUXEDO配置文件全路徑
ENVFILE?????????? 環境文件全路徑
ULOGPFX???????? 應用日志文件全路徑
MAXACCESSERS 本機最多處理器數,可以超越*RESOURCES節定義
MAXCONV??????? 本機最大會話數,可以超越*RESOURCES節定義
?
范例
*MACHINES
gumby??????????????? LMID=SITE1
TUXDIR=”/usr/tuxedo”
APPDIR=”/usr/apps/atmapp”
TUXCONFIG=” /usr/apps/atmapp/atmapp.tux”
ENVFILE=” /usr/apps/atmapp/ENVFILE”
ULOGPFX=”/usr/apps/atmapp/logs/ULOG”
MAXACCESSERS=100
MAXCONV=15
?
組定義
?????? *GROUP節包含服務組的定義。一臺機器至少要定義一個服務組。如果沒有定義組,管理命令tmadmin可能依然能運行。
?????? 每個組只要定義組名,映射組名的組號和邏輯機器名。組為分布式交易系統和數據依賴路由等靈活性措施提供了支持。
參數??????????????????? 意義
*GROUPS???????? GROUP節
BANKB1??????????? 組的唯一標識符,可以是字母數字
GRPNO???????????? 組的唯一數字標識符
LMID?????????????????? 組所在的機器
范例
*GROUPS
BANKB1???? GRPNO=200??? LMID=SITE1
BANKB2???? GRPNO=220??? LMID=SITE1
SYSGRP??? GRPNO=110??? LMID=SITE1
EVTGRP1? GRPNO=120??? LMID=SITE1
?
服務定義
?????? ubbconfig的*SERVERS???? 節包含的是服務進程的信息。本節中每一個入口代表一個應用啟動時加載的服務。這些信息包含服務名,命令行參數,服務環境,重啟動等等。由于每個服務功能各不相同,其配置參數也因此相同或相異。
參數??????????????????? 意義
*SERVERS????????????? SERVER節,列出所有服務程序
DEFAULT:? ?????? 本處列出的參數為其下列出的服務的缺省值,但可以被單列條目替代相應值
RESTART? 如果設成Y,則服務可以重啟動
MAXGEN??? 在GRACE定義時間之內,服務可以重啟動MAXGEN次
GRACE????????????? 周期,單位是秒
?????? RCMD???????? 每次服務重啟動,本處定義的腳本或命令被執行
?????? ENVFILE??? 列有環境變量的文件,在交易啟動前設入環境
TLR????????????? ?????? 一個服務名,用buildserver建立,應在APPDIR或$TUXDIR/bin
SRVGRP??? 服務屬于一個在*GROUPS節中定義的服務組;如果需要移植服務,也可以定義在多個組中。
SRVID???????? 服務組中代表服務的唯一值
MIN????????????? 最少在啟動時啟動的服務數
MAX??????????? 運行時,最多可以起的實例數
CLOPT??????? 跟隨服務啟動的其他參數
-A ??????? 服務內建交易全發布
–r?????????? 指定服務記錄時間戳,用于以后計算交易處理時間
????????????? -e???????? 定義標準錯誤重定向文件
????????????? -o???????? 定義標準輸出重定向文件
????????????? --??????????? TUXEDO參數和服務特定參數的分隔符
????????????? …????????? 傳給tpsvrinit()的參數
SYSTEM_ACCESS???????????? 設定后,應用錯誤不干擾公告牌
RQADDR?? 當設定此項后,所有本服務的實例都使用相同的請求隊列。這是在應用中設置MSSQ(Multiple Server Single Queue)的方便辦法,可以改善處理流量。任何時候,所有MSSQ集中的實例發布相同的交易集。
XFER???????????????? 另一個服務
REPLYQ???? 設成Y,則服務又作為一個MSSQ集配置,任何其中的交易調用其他交易,就建立一個單獨的回應隊列。
范例
*SERVERS
DEFAULT:? RESTART=Y??? MAXGEN=5????? GRACE=3600
???????????????????? RCMD=”/sur/apps/atmapp/scripts/beeper”
???????????????????? CLOPT=”-A”????? ENVFILE=”/usr/apps/atmapp/envfile”
TLR????????????? SRVGRP=BANKB1????? SRVID=10? MIN=1? MAX=2
???????????????????? CLOPT=”-A–r
???????????????????? -e/usr/apps/atmapp/logs/TLR1.err
???????????????????? -o/usr/apps/atmapp/logs/TLR1.out
???????????????????? --
???????????????????? -T101 –e 300 –d dbfile”
???????????????????? SYSTEM_ACCESS=PROTECTED
???????????????????? RQADDR=”TLR_Q1”
XFER?? SRVGRP=BANKB1????? SRVID=20? MIN=1? MAX=2
????????????? RQADDR=”XFER_Q1” REPLYQ=Y
????????????? CLOPT=”-A–r”
?
交易定義
???? *SERVICES節提供了應用的特殊交易的信息。包括負載平衡(LOAD)和數據緩沖類型檢查(BUFTYPE)。如果全部都是缺省值則本節可以省略。
參數??????????????????? 意義
*SERVICES????? 交易節
#????????????????????????? 注釋行符號
大寫字母??? 交易名,由應用服務提供
BUFTYPE? 任何向該交易的請求,數據應該是此處定義類型
GROUP????? 交易所在服務所在的組
LOAD????????? 負載因子,表示處理請求的時間,用于計算負載平衡
PRIO?????????? 優先級
?
范例
*SERVICES
#comment line
DEPOSIT??? BUFTYPE=”FML”
???????????????????? SRVGRP=BANKB1
???????????????????? LOAD=25?? PRIO=70
?
?生成TUXCONFIG文件
?????? UBBCONFIG文件是一個可以編輯成需要的應用配置的文本文件。但是,/T在實際應用上讀取的是二進制TUXCONFIG文件用于操作。命令tmloadcf可以把UBBCONFIG文件轉化成TUXCONFIG文件。
?????? tmloadcf命令接受以下4個參數:
-c??? 計算運行應用需要的IPC資源,該信息將提供給管理員,用于在各機器上配置資源。
-n?? 進行語法檢查并不生成TUXCONFIG。
-b??? 控制TUXCONFIG占用的物理頁數。
-y??? 無條件覆蓋TUXCONFIG
環境變量TUXCONFIG必須設定指向二進制TUXCONFIG文件。
在安全要求高的應用中,tmloadcf不能從標準輸入接受,環境變量APP_PW必須包含應用密碼。
tmunloadcf將TUXCONFIG轉換成ASCII格式用于檢查。該工具讀取環境變量TUXCONFIG指向的文件。輸出包含所有的參數,包括TUXEDO設定的缺省值,是UBBCONFIG文件的一個超集。
管理命令Administrative Commands
?
?
本節要點
 
 
 
l? 命令tmboot
l? 命令tmshutdown
l? 命令tmadmin
l? 批處理命令
l? 服務移植
?
命令tmboot
tmboot命令啟動TUXEDO系統的/T應用,創建必要的IPC資源、啟動相關機器的規定的系統和應用服務進程。大多數的tmboot的參數啟動了部分系統進程。在以下說明和例子中,lmid,grpname和srvid是配置文件中指定的值。
-A????????? 啟動所有機器上的管理進程。??????????
-M????????? 啟動主控機器上的管理進程。
-i srvid? 啟動服務id等于????? srvid的進程。
-g grpname 啟動指定的一組服務(含TMS)
-S????????? 啟動所有應用服務。
-s server-name 啟動可執行文件名為server-name的服務。
-l lmid?? 啟動TMS和指定機器上的應用服務。
-T grpname ????? 啟動指定組中所有TMS。
-B lmid???????? 啟動指定機器上的BBL。
-e command???????????? 指定啟動進程失敗后在主控機器上運行的命令名。
-c?????????? 打印本配置所需最少的IPC資源。
?
?
命令tmshutdown
tmshutdown命令用于關閉所有或部分應用并釋放IPC資源。
本命令所用參數與tmboot類似(如:-A, -g, -i, -s, -S, -l, -M, -B),意義相同。
如果需要移動服務,關閉服務時用-R參數即可不刪除BB中的入口。
在非主控節點上,可以用-P參數僅關閉該機器上的應用。
當有客戶端正在連接時,tmshutdown 不能關閉管理服務。參數-c則可以超越此規則。該參數僅用于管理員需要立即關機而又無法及時通知客戶端時。
參數-wdelay 在delay秒后進行強制關閉。指定的服務當即被掛起,使之不能繼續接受交易請求。delay的值則允許服務在一個合理的時間內完成已經接受的請求。在延遲的時間到達后,信號SIGKILL(或SIGTERM)將發給指定的服務。該參數目的是使管理員能夠關閉發生死循環或死鎖的服務。
管理工作和工具
?
主要有以下兩個管理工具:
2? 使用圖形界面的圖形管理接口(Graphical Administration Interface—GAI)
2? tmadmin
通常管理工作有以下3類:
2? 監視運行系統
一般監視以下信息:應用、服務、客戶端、交易、隊列、組、會話、網絡等。
2? 動態修改服務或交易參數
使用GAI 或tmadmin可以動態進行以下調整:
——交易可以掛起、恢復、發布和取消
——交易參數可以修改,如:LOAD和PRIORITY
——指定交易的超時時間
——交易口令
2? 進行啟動,關閉,移動服務等管理員的任務
服務信息
?????? 來自GAI的信息本處略去。
?????? 以下是tmadmin命令的printserver(簡寫為psr)的簡單輸出。
列號???????????? 描述
1.????服務的可執行文件名
2.????服務連接的隊列名
3.????組名
4.????服務的數字id
5.????服務已經處理的請求數
6.????服務處理的全部請求的參數和
服務正在處理的交易,若為IDLE則服務當前是空閑
ccsmis:/home2/ccsmis>tmadmin
tmadmin - Copyright (c) 1996 BEA Systems, Inc.
Portions * Copyright 1986-1997 RSA Data Security, Inc.
All Rights Reserved.
Distributed under license by BEA Systems, Inc.
Tuxedo is a registered trademark.
?
> printserver
Prog Name????? Queue Name? Grp Name?????ID RqDone Load Done Current Service
---------????? ----------? --------?????-- ------ --------- ---------------
rz_Ecsb??????? 00004.04000 APGP2?????? 4000?????0???????? 0 (? IDLE )
BBL??????????? 70020?????? simple???????? 0?????1??????? 50 (? IDLE )
IFMTMS???????? APGP2_TMS?? APGP2?????30001????? 1??????? 50 (?IDLE )
ftpserv32????? 00002.00001 FTPGP????????? 1????60????? 3000 (? IDLE )
WSL??????????? 00001.00001 SYSGP????????? 1?????0???????? 0 (? IDLE )
IFMTMS???????? APGP2_TMS?? APGP2?????30002???? 12??????600 (? IDLE )
ftpserv32????? 00002.00002 FTPGP????????? 2?????0???????? 0 (? IDLE )
IFMTMS???????? APGP2_TMS?? APGP2?????30003???? 11?????? 550 (?IDLE )
CCS_QUANBIA_6000004.06004 APGP2?????? 6004????? 0????????0 (? IDLE )
CCS_SCBB_4099? 00004.04099 APGP2?????? 4099?????2?????? 100 (? IDLE )
CCS_GEKEZI_30000004.03000 APGP2?????? 3000????? 0????????0 (? IDLE )
:
交易信息
?????? 來自GAI的信息本處略去。
?????? 以下是tmadmin命令的printservice(簡寫為psc)的簡單輸出。
列號????? 描述
1.????交易名
2.????交易函數名
3.????服務可執行文件名
4.????服務所在組名
5.????服務的數字id
6.????提供交易的機器的LMID
7.????交易已經執行的次數
8.????交易當前狀態
Service NameRoutine Name Prog Name? Grp Name? ID???Machine? # Done Status
------------------------ ---------? --------? --???-------? ------ ------
416701?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
416601?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
416501?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
416401?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
416201?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000 ????simple??????0 AVAIL
416301?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
416101?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
416001?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
415901?????? rz_Ecsb????? rz_Ecsb???APGP2?? 4000???? simple?????? 0 AVAIL
:
?
隊列信息
????????????? 以下是tmadmin命令的printqueue(簡寫為pq)[qaddress]的簡單輸出。如果不指定address,所有隊列信息將被輸出。
列號?????????????????????????? 描述
1.????隊列連接的服務的可執行文件名
2.????字符隊列名,是RQADDR參數或一個隨機值
3.????連接的服務數
4.????當前隊列的所有請求的參數和
5.????實際請求數
6.????平均隊列長度
7.????隊列所在機器的LMID
> pq 00004.05062
Prog Name????? Queue Name? # Serve Wk Queued? # Queued?Ave. Len??? Machine
---------????? ------------------- ---------? --------?--------??? -------
CCS_GEDAIPC_5000004.05062?????? 1???????? 0???????? 0??????0.0???? simple
客戶端信息
?????? 來自GAI的信息本處略去。
?????? 以下是tmadmin命令的printclient(簡寫為pclt)的輸出,來自TUXEDO系統的日志信息。主要有以下信息:
客戶端id,用戶名和當前狀態
登錄的LMID和進程號(PID)
服務組和上一訪問過的服務組
交易(啟動/提交/中斷)和會話的統計數字
中繼隊列id,通知方法和提交控制
列號?????????????????????????? 描述
1.????已經登錄的客戶端機器的LMID
2.????用戶名,由tpinit()提供的
3.????客戶端名,由tpinit()提供的
4.????客戶端連接后經過的時間
5.????客戶端狀態
6.????IDLE——表示客戶端目前沒有任何交易在工作
7.????IDLET——表示客戶端啟動了一個交易
8.????BUSY——表示客戶端在工作中
9.????BUSYT——表示客戶端正在交易控制下工作
10.? 啟動/提交/中斷的交易數
> pclt
???? LMID???????? User Name?????? Client Name??? Time???Status? Bgn/Cmmt/Abrt
------------------------------ --------------- -------- ------- -------------
simple????????? ccsmis???????? ?WSH????????????17:42:47 IDLE??? 0/0/0
simple????????? ccsmis????????? tmadmin????????? 0:44:28 IDLE??? 0/0/0
?
用tmadmin寫腳本
輸出所有服務/交易/隊列信息
$tmadmin 2>&1<<!
echo
verbose
psr
psc
pq
!
掛起bankapp內所有AUDIT交易
(tmadmin2>&1 <<!
pq
!
) |
awk ‘BEGIN { print “tmadmin <<! \necho”}
{if ( $1 == “AUDIT”) print “susp –q” , $2, “-S $1”}
END {print “q\n!”}’ |
/bin/sh
移植服務
該功能使管理員可以將服務移動到其他位置。服務可以用migrategroup(migg)[-cancel] group移植一組服務,或用migratemach(migm) [-cancel] machine移植一臺機器上的服務。
以下是移植服務的步驟:
1. 服務必須用tmshutdown或-R參數關閉。該參數包含公告牌中的服務名。 ?
2.在配置文件中的*RESOURCES段必須指明MIGRATE
*RESOURCES
…
OPTIONS?? MIGRATE
…
?
3.在*GROUP段中,被移植的服務組在LMID參數中必須有替代位置。當移植機器時,所有組的LMID參數的替代位置必須相同。
*GROUP
…
APGP2 LMID=SITE1,SITE2
…
?
4.服務必須可以重啟動,以下是*SERVERS段有關內容
*SERVERS
…
rz_Ecsb?????? SRVGRP=APGP2? RESTART=Y
…
?
移植在關閉后將被取消。migg 和migm–cancel 參數在服務關閉后從公告牌刪除服務名。所以,服務需要重啟動才可以使用。
$tmadmin
>stop –R –g APGP2
Shutting down server processes …
>psr –g APGP2
Prog Name????? Queue Name? Grp Name?????ID RqDone Load Done Current Service
---------????? ----------? --------?????-- ------ --------- ---------------
rz_Ecsb??????? 00004.04000 APGP2?????? 4000?????0???????? 0 (? IDLE )
IFMTMS???????? APGP2_TMS?? APGP2?????30001????? 1??????? 50 (?IDLE )
IFMTMS???????? APGP2_TMS?? APGP2?????30002???? 16?????? 800 (?IDLE )
IFMTMS???? ????APGP2_TMS??APGP2????? 30003???? 15??????750 (? IDLE )
CCS_QUANBIA_6000004.06004 APGP2?????? 6004????? 0????????0 (? IDLE )
CCS_SCBB_4099? 00004.04099 APGP2?????? 4099?????2?????? 100 (? IDLE )
>migg APGP2
migration successfully completed
?
?
緩沖數據類型????? Buffer Types
?
本節要點
l? STRING
l? VIEW
定義
偽代碼中VIEW的使用
代碼示例
l? FML
定義
偽代碼中FML的使用
代碼示例
l? 結合FML和VIEW
l? CARRAY的定義
l? FML32和VIEW32
簡介和STRING
TUXEDO使用固定類型的數據緩沖進行遠程或本地進程間通訊。例如”STRING”就是一種包含了字符數組的一種數據緩沖。絕大多數商業應用需要不止一種數據。
TUXEDO已經預定義了一些數據緩沖類型用以傳遞各種數據。每種都有其獨特的處理方法和相應特性。
STRING
STRING類型緩沖是一串以NULL結尾的字符。TUXEDO為STRING類型編、解碼。無論緩沖分配了多大,將由NULL所在位置決定其長度。
TUXEDO的STRING緩沖的使用與C語言程序中的字符數組非常類似。
分配
buf = tpalloc ( “STRING”, NULL, 4*1024);
用法
strcpy ( buf “HELLO WORLD”);
調用交易
tpcall (“INQUIRY”, buf , 0, &buf,&len, 0);
?
?
?
?
VIEW
VIEW的概念和例子
TUXEDO使用VIEW類型數據緩沖處理結構或復雜數據類型。
使用VIEW的優點:
2?結構化數據表示,可以方便地訪問數據元素
2?將多個數據元素綁定在一個定義良好的數據結構上
缺點:
2?所有數據元素都通過,不檢查合法性
范例:
struct MYVIEW {
 ? float??float1;
 ? double?double1;
 ? long???long1;
 ? short??short1;
 ? int????int1;
 ? dec_t??dec1;
 ? char???char1;
 ? char???string1[20];
 ? unsigned short L_carray1[2];??? /* length array of carray1 */
 ? short??C_carray1;????????????? /* countof carray1 */
 ? char???carray1[2][20];
 };
$ /* View data structure */
 ? VIEW MYVIEW
 ? #type??cname?? fbname? count??flag??? size??? null
 ? float??float1? -?????? 1??????-?????? -?????? -
 ? double?double1 -?????? 1?????? -??????-?????? -
 ? long???long1?? -?????? 1??????-?????? -?????? -
 ? short??short1? -?????? 1??????-?????? -?????? -
 ? int????int1??? -?????? 1??????-?? ????-??????-
 ? dec_t??dec1??? -?????? 1??????-?????? 9,16??? -
 ? char???char1?? -?????? 1??????-?????? -?????? -
 ? string?string1 -?????? 1?????? -??????20????? -
 ? carray?carray1 -?????? 2?????? CL?????20????? -
 ? END
??
使用VIEW的步驟:
2?建立一個VIEW文件
2?設置環境變量
VIEWDIR=$APPDIR
VIEWFILES=cust.V,other.V
export VIEWDIRVIEWFILES
2?編譯VIEW文件
viewc –ncust.V
2?在代碼中包含頭文件
2?編譯
2?運行
代碼范例:
#include <stdio.h>
#include “atmi.h”
#include “cust.h”
main(int argc, char *argv [ ])
{
?????? structcust *buf;
?????? longrcvlen;
?????? if(tpinit ((TPINIT *) NULL) == -1)
{
?????? ?????? ptintf(“tpinit(): %s\n”,tpstrerror(tperrno));
?????? ?????? exit(1);
}
?????? buf=(structcust *)tpalloc(“VIEW”,”cust”,sizeof(struct cust));
?????? if(buf == (struct cust *)NULL)
{
????????????? printf(“ERROR:tpalloc(VIEW,cust),%s\n”,tpstrerror(tperrno));
????????????? tpterm();
????????????? exit(1);
}
?????? strcpy(buf->fsst_name,”Mel”);
?????? strcpy(buf->lst_name,”Gibson”);
?????? buf->acct_id= 10002;
?????? buf->branch_id= 5;
?????? ret= tpcall (“INQUIRY”,(char *)buf,0,
?????????????????????????????????? (char**)&buf,&rcvlen,0);
?????? if(ret == -1)
{
????????????? printf(“tpcall(INQUIRY): %s\n”, tpstrerror(tperrno));
?????? ?????? tpfree((char *) buf);
?????? ?????? tpterm();
?????? ?????? exit(1);
}
????????????? printf(“Returned amount is : %1.1s\n”, buf->amount);
????????????? tpfree((char*)buf);
????????????? tpterm();
}
?
?
FML
?
概念
?
?????? 預定義方式的VIEW有一些缺點:
2? 改變不靈活
2? 結構變化時,所有程序需要重新編譯
2? 即使沒有數據,空間也被占用
為克服以上缺點,TUXEDO提供另一種預定義數據,按照‘名字/值’組對格式組織數據。該方式稱為FML(Fielded Manipulation Language)。
FML由以下部分構成:
2? FML API
2? FML命令行工具
?
| FML頭部,包含索引 | |
| FLOAT1 | 5.00 | 
| DOUBLE1 | 12.34 | 
| LONG1 | 12345 | 
| SHORT1 | 12 | 
| … | … | 
| 域名 | 域值 | 
?
?
使用FML的步驟
2?建立一個FML文件:bank.flds
# name?????? number???type???? flags?? comments
 ? FLOAT1???? 110??????float??? -??????-
 ? DOUBLE1??? 111??????double?? -?????? -
 ? LONG1????? 112??????long???? -?????? -
 ? SHORT1???? 113??????short??? -?????? -
 ? INT1?????? 114??????long???? -?????? -
 ? DEC1?????? 115??????string?? -?????? -
 ? CHAR1????? 116??????char???? -?????? -
 ? STRING1??? 117??????string?? -?????? -
 ? CARRAY1??? 118??????carray?? -?????? -
?
?
2?設置環境變量
FLDTBLDIR=$APPDIR:$TUXDIR/udataobj
FIELDTBLS=bank.flds,Usysflds
exportFLDTBLDIR FIELDTBLS
2?用mkfldhdr編譯
mkfldhdrbank.flds
2?編碼
參見下一章節
2?編譯程序
buldclient –fatmclt.c –o atmclt
FMLAPI
#include <fml.h>
Falloc(int num_of_flds,FLDLEN space)
Finit(FBFR *f)
Fsizeof(FBFR *f,FLDLEN len)
Fadd(FBFR *f,FLDID fldid,int oc,char*value,FLDLEN len)
Fprint(FBFR *f)
Fget(FBFR *f,FLDID fldid,int oc,char*value,FLDLEN len)
Fchg(FBFR *f,FLDID fldid,int oc,char*value,FLDLEN len)
Fcpy(FBFR *f, FBFR *f2)
f = (FBFR *)tpalloc(“FML”,NULL,200)
Ffprint(FBFR *fbfr,FILE *iop)
2?Fprint()是一個有用的調試函數,因為它可以打印出緩沖內容而不需要定義數據類型和輸出格式。
2?Falloc()用于內部進程通訊
2?Fcpy()用來復制FML的內容,特別是在不同服務的交易之間
代碼范例:
#include <stdio.h>
#include “atmi.h”
#include<fml.h>
#include “bank.flds.h”
int main (int argc,char **argv)
{
?????? longaccount ;
?????? floatbalance;
?????? floatamount;
?????? FBFR*sendBuf, *recvBuf;
?????? sendBuf= (FBFR *) tpalloc(RMLTYPE,NULL,Fneeded(20,4*1024));
?????? recvBuf= (FBFR *) tpalloc(RMLTYPE,NULL,Fneeded(20,4*1024));
?????? if(Fchg(sendBuf, ACCOUNT_ID,0,(char * )&account,0) == -1)
{
????????????? printf(“\nERROE:Fchg(ACCOUNT_ID):%s\n”,Fstrerror(Ferror));
}
?????? if(tpcall(“INQUIRY”,(char*)sendBuf,0,
(char**)&recvBuf,&len,TPSIGRSTRT)== -1
{
?????? if(Fget(recvBuf,STATLIN,0,tmpstr,0)!=-1)
{
????????????? printf(“\n%s\n”,tmpstr);
}
????????????? printf(“\nERROR:tpcall(INQUIRY):%s\n”,tpstrerror(tperrno));
?????? else
{
?????? if(Fget(recvBuf,BALANCE,0,(char*)&balance,0) == -1)
{
????????????? printf(“\nERROR:Fget(BALANCE):%s\n”,Fstrerror(Ferror));
}
?????? else
{
????????????? printf(“\nBalance:%s\n”,balance);
}
}
????????????? tpfree((char*) sendbuf);
????????????? tpfree((char*) recvbuf);
?????? tpterm();
}
?
結合FML和VIEW
?????? FML的使用需要進一步的考慮,例如,訪問FML數據會慢一些,因為接口要插入或取回數據。在某些場合,需要進行一些推敲。而VIEW則提供了一個通用管理數據緩沖的方案。
?????? FML的優點是可以在機器間傳遞數據和靈活的存儲數據。而VIEW則傳遞整個定義好的C結構,不管域里面是否有數據。可以使用它們的混合:FML-VIEWS。
?????? TUXEDO提供了2個API把FML轉換成VIEW
2? int Fvstof(FBRF *bufptr,char *cstruct,int mode,char *view)將VIEW結構轉成FML
2? int Fvftos(FBFR *bufptr, char *cstruct, char *view)?? 將FML數據轉成VIEW結構
?
其他數據類型
?????? 除FML,VIEW和STRING類型外,另外一個主要的數據緩沖類型是CARRY。
CARRY
CARRY數據緩沖類型是一種定長的,相對獨立于機器的數據。
2?長度需要定義
2?不進行編/解碼
2?可用來傳遞二進制數據
2?可以作為FML和VIEW的子項
2?用于文件、圖形傳輸
FML32和VIEW32
?????? 在對FML和VIEWS初始化時,尋址是16位的。隨著主要的平臺都變成32位的,TEXUDO增加了FML32和VIEWS32。
2?使用32位尋址方式
2?有更大的尋址空間(2GB)
2?API與16位的相似,只在名字上加了‘32’字樣
?
?
數據依賴型路由??? Data Dependent Routing
?
本節要點
l? 定義
l? 過程
ubbconfig
?
?
?
簡介
?????? 當遇到非常巨大的數據需要傳遞時,可以將單一的數據分割成幾個部分進行傳遞。分割的標準根據其商業應用而定。例如,可以根據省份、郵政編碼或金額來分割數據。
?????? 在TUXEDO中,數據依賴型路由解決了此類大型商業應用的難點,而且不需要進行任何程序工作。僅僅改變一下ubbconfig文件就可以了。
數據依賴型路由是根據數據緩沖區中一個指定域的值,把一個交易請求映射到一個指定的服務組的機制。
?
?
?
數據依賴型路由
?????? 數據依賴路由(DDR-Data Dependent Routing)需要在UBBCONFIG文件中的*GROUPS節創建多個入口,并分割組中應用的資源或任務。每個組可以訪問各自的數據庫并且可以屬于獨立的機器。注意:一個組不能同時跨越一臺以上的機器。
?????? 一個有多組獨立服務的大型數據庫可以被分成幾個獨立數據集。
?????? 此類數據分割的實現是通過對交易請求的緩沖數據值的路由。DDR是基于FML,FML32,VIEW和VIEW32數據緩沖。
???? TUXEDO使用的路由信息位于共享內存中的公告牌。在ubbconfig文件中有特別的部分對路由進行定義。路由的定義包含了數據使用的域和數據區間及其對應的服務組。
?????? TUXEDO通過對比調用交易內碼和共享內存中公告牌中數據路由的值的區間選擇目標服務。
?????? 在我們的例子中,路由決定于數據域ID。交易請求映射于組G1,G2和G3。每個遠程或本地機器上的組都提供相同的交易。
?
使用DDR的ubbconfig的范例
*GROUP
BANKB1??????????? LMID=SITE1???? GRPNO=200
BANKB2??????????? LMID=SITE2???? GRPNO=220
*SERVICES
WITHDRAWAL??????? ROUTING=ACCOUNT_ID
*ROUTING
ACCOUNT_ID? FIELD=ACCOUNT_ID
????????????? BUFTYPE=”FML”
????????????? RANGES=”1-10:BANKB1,
?????????????????????????????????? 11-20:BANKB2”
BRANCH_ID??? FIELD=BRANCH_ID
???????????????????? BUFTYPE=”FML”
???????????????????? RANGES=”0-555:BANKB1,
????????????????????????????????????????? 556-888:BANKB2”
*GROUPS節說明
LMID與每個組相聯系。本例中是同一臺機器上的設置。當然也可以設成遠程機器。
*SERVICES節說明
分割標準是為此交易設置。ROUTING是分割標準的名字
*ROUTING節說明
FILED表示請求交易的那些值用于映射組。
BUFTYPE表示其緩沖數據類型。RANGE定義路由到不同組的數據邊界。
可以使用通配符’*’。
?
網絡??? Networking
簡介
?
基于以下原因,一個商業應用需要分布于多臺機器上:
2? 負載均衡
2? 容錯
2? 地理分布
???????使用TUXEDO,不需編程,應用就可以被分布配置在多臺機器上。
????????
本節要點
l? 概念
l? UBBconfig
?
?
?
?
多機配置
TUXEDO通過一些部件實現和管理一個多機應用。以下是這些部件和功能描述:
?
?
| 部件 | 功能 | 
| BBL | BBL(Bulletin Board Liaison)記錄所有應用服務狀態,顯示于公告牌(Bulletin Board)。BBL同時修改來自DBBL的全局信息。 | 
| DBBL | DBBL(Distinguished Bulletin Board Liaison)記錄所有BBL的狀態。運行于主節點上,只有一份。 | 
| BRIDGE | 提供TUXEDO節點間的通訊機制,僅處理ATMI數據。作為系統提供的服務,是最早啟動的兩個進程。 | 
| tlisten | ‘tlisten’在啟動過程中被使用,必須先于TUXEDO應用的啟動。 | 
?
?
?
?
多機配置
tlisten用法
tlisten –d /dev/tcp –l//lcspn1:3050 –L/usr/apps/atmapp/logs/tlog
特點
2?無須編程
2?交易位置對程序員和用戶透明
2?公告牌提供全局名字服務
?
?
?
一個簡單的UBBCONFIG范例
#ubbconfig file for MP configuration
*RESOURCES
MASTER?????????? SITE1,SITE2
BBLQUERY???????????? 100
DBBLWAIT??????? 20
MODEL????????????? MP
OPTIONS????????? LAN,MIGRATE
*MACHINES
lcspn1??????????????? LMID??????????? =SITE1
??????????????????????????? TUXDIR????? =”/usr/tuxedo”
??????????????????????????? TUXCONFIG=”/home/apps/atmapp/atmapp.tux”
??????????????????????????? APPDIR???????????? =”/home/apps/atmapp”
??????????????????????????? TYPE?????????? =RS6000
Lcspn2?????????????? LMID??????????? =SITE2
??????????????????????????? TUXDIR????? =”/usr/tuxedo”
??????????????????????????? TUXCONFIG=”/home/apps/atmapp/atmapp.tux”
??????????????????????????? APPDIR???????????? =”/home/apps/atmapp”
??????????????????????????? TYPE?????????? =RS6000
*NETWORKS
SITE1????????? NADDR???????????? =”//lcspn1:3050”
???????????????????? NLSADDR??????? =”//lcsnp1:3051”
???????????????????? BRIDGE???????????? =”/dev/xti/tcp”
SITE2????????? NADDR???????????? =”//lcspn2:3050”
???????????????????? NLSADDR??????? =”//lcsnp2:3051”
???????????????????? BRIDGE???????????? =”/dev/xti/tcp”
*GROUPS
BANKB1???? GRPNO1=1????????????? LMID=SITE1
BANKB2???? GRPNO1=2????????????? LMID=SITE2
*SERVICES
WITHDRAWAL
*RESOURCES節說明
MASTER參數表示TUXEDO在此處初始化它的啟動次序,同時表示DBBL在何處運行,出錯時SITE2將作為SITE1的備份。
BBLQUERY決定應用的BBL訪問主控節點上DBBL的頻率,單位是秒。
當BBL在規定的BBLQUERY時間內沒有響應,DBBL會發送一條信息給它,DBBLWAIT即等待響應的超時時間,單位是秒。
MODEL表示TUXEDO是否運行在多臺機器上。
*MACHINES節說明
?????? 描述了TUXEDO應用或系統安裝的物理方面的信息。物理機器名”lcspn1”映射到邏輯機器名”SITE1”和LMID(Logical MachineIdentifier)邏輯機器標識符。
?????? 參數TYPE用來決定是否在機器間傳輸時需要進行編、解碼。它可被設置成任何字符串。當兩機此參數不同時,進行編、解碼。
*NETWORKS節說明
?????? 在單機配置時,此節略去。在多機時,此節必須。
?????? TUXEDO機器間通過主機地址和端口號傳遞ATMI數據,這些由NADDR按以下的規定定義:
?????? //lcspn1????????????? 主機名
?????? :??????????????????????? 分隔符
端口號
NLSADDR定義的是tlisten進程的主機地址和端口號。
BRIDGE用于和其他TUXEDO機器通訊的網絡設備由BRIDGE定義。
?
分布式事務處理Distributed TransactionProcessing
?
簡介
?????? 分布式事務處理(DistributedTransation Processing-DTP)是運行一組需要訪問一定量資源的交易或工作的必須的功能。要求保證交易動作必須全部成功或者全部失敗,不能存在‘部分成功’的情況。
?????? TUXEDO系統使用XA協議在本地與遠程機器間協同事務活動。
?
本節要點
l? 定義
l? XA
l? 2段式提交協議
l? ATMI事務API
l? 過程
l? ubbconfig
創建格式化事務日志
用ATMI交易API寫程序
分布式事務處理和XA接口
分布式事務處理(Distributed Transation Processing-DTP)有能力處理多數據庫間、全局事務而不必考慮交易各方及其資源的位置。
服務使用嵌入式SQL接口去訪問數據庫。在一個“全局交易”中TM和RM使用XA接口保證執行所有的資源訪問動作。
全局事務通常最初被ATMI調用,包含一個以上的組;由客戶端和服務端啟動、提交或撤消。TUXEDO通過全局事務標識符(Global TransactionIdentifier-GTRID)控制所有參與部分。
RM?????????????? 資源管理者(Resource Manager),本例中是一個數據庫。
XA??????????????? 控制RM提交或回滾所有動作的協議。
TMS??????????????????? TUXEDO的事務管理服務(Transaction Management Server),能夠按XA協議與RM聯系。TMS負責協調系統范圍內事務相關資源管理。應用程序員可以通過ATMI事務API與TMS聯系。
GTRID? ?????? 全局事務標識符(Global TransactionIdentifier)。
TLOG??? ?????? 事務日志,用于跟蹤交易所有部分。
?
?
?
二段式提交(2 Phase Commit)
?
?
分布式事務處理的UBBCONFIG
?
分布式事務處理的UBBCONFIG范例
#A NULL TMS Example
*RESOURCES
?MAXGTT????????? 20
?CMTRET????????? COMPLETE
*MACHINES
?lcspn1?????? LMID??????????? =SITE1
????????????? TUXDIR????? =”/usr/tuxedo”
????????????? APPDIR???????????? =”/usr/apps/atmapp”
????????????? TUXCONFIG=”/usr/apps/atmapp/atmapp.tux”
????????????? ENVFILE?????????? =”/usr/apps/atmapp/ENVFILE”
????????????? TLOGDEVICE? =”/usr/apps/atmapp/logs/TLOG”
????????????? TLOGNAME????? =TLOG
????????????? TLOGSIZE???????? =100
*GROUPS
DEFAULT:
?????? TMSNAME =TMS
?????? TMSCOUNT=2
?????? OPENINFO=”“
?????? CLOSEINFO=”“
BANKB1???? LMID=SITE1???? GRPNO=200
BANKB2???? LMID=SITE2???? GRPNO=220
*SERVICES
TRANSFER????? AUTOTRAN=Y TRANTIME=30
*RESOURCES節說明
?????? MAXGTT限制了一臺機器上同時可以提供的GTRID數。最大值是2048,最小是0,缺省100;
?????? CMTRET設成LOGGED時表示tpcommit()在所有部分都成功預提交時返回;設成COMPLETE時表示tpcommit()在所有部分都成功提交才返回。
*MACHINES節說明
?????? TLOGDEVICE指出了該機器包含事務日志(TLOG)的文件系統。
?????? TLOGNAME指出了該機器的事務日志名字。
?????? TLOGSIZE指出了該機器事務日志的大小,單位是物理頁數。最大值是2048,最小是0,缺省100
*GROUPS節說明
?????? TMSNAME是事務管理服務的可執行文件名
?????? TMSCOUNT是TMS啟動的數量(最小2,最大10,缺省3)
?????? OPENINFO是一個用于打開RM的信息的字符串
?????? CLOSEINFO是一個用于關閉RM的信息的字符串
?????? AUTOTRAN設成N則該交易初始化成無事務方式,Y則反之。
?????? TRANTIME事務創建的超時時間,單位為秒。
創建事務日志的腳本
tmadmin <<!
crdl –b 500 –z /usr/apps/atmapp/logs/TLOG–O 0
crlog –m STIE1
!
為支持分布式事務處理,必須創建一個格式化的設備記錄事務信息。上文是用tmadmin命令的腳本生成此種設備的例子。
?
?
ATMI 事務API
事務API通過ATMI給應用提供了以下操作
2?通過tpbegin(),tpcommit(),tpabort()控制事務的開始和結束。
int tpbegin(int timeout, long flags)
int tpcommit(long flags)
int tpabort(long flags)
2?通過tpsuspend(),tpresume()管理多個并發的事務。
int tpsuspend(TPTRANID *tranid, longflags)
int tpresume(TPTRANID *tranid, longflags)
2?通過tpscmt()設定提交返回方式為”logged”或”complete”
int tpscmt(long flags)
TP_CMT_LOGGED-在第一段后返回
TP_CMT_COMPLETE-在第二段后返回
2?通過tpgetlev()決定當前事務模式
int tpgetlev(void)
2?通過tpopen(),tpclose()為服務組打開或關閉RM
int tpopen(void)
int tpclose(void)
使用ATMI事務API的代碼范例
/* 確保交易TRANSFER沒有設成AUTOTRAN? */
#include <atmi.h>
FBFR?? *sendBuf=NULL;
FBFR?? *recvBuf=NULL;
Void TRANSFER(TPSVCINFO *transb)
{
?????? sendBuf= (FBFR *)transb;
?????? …
?????? if(tpbegin(30,0) == -1)
?????? {
????????????? userlog(“FAILEDTO BEGIN TRANSACTION:%s”,tpstrerror(tperrno));
????????????? tpreturn(TPFAIL,-1, (char *)recvBuf, 0, 0);
?????? }
?????? if( tpcall(“WITHDRAWAL”, (char *)sendBuf, 0, (char **)&recvBuf, &len,0)==-1)
?????? {
????????????? userlog(“tpcall(WITHDRAWAL) fail:%s”, tpstrerror(tperrno));
????????????? tpreturn(TPFAIL,-1, (char *)recvBuf, 0, 0);
?????? }
…
if ( tpcall(“DEPOSIT”, (char *)sendBuf,0, (char **)&recvBuf, &len, 0)==-1)
?????? {
????????????? userlog(“tpcall(DEPOSIT) fail:%s”, tpstrerror(tperrno));
????????????? tpreturn(TPFAIL,-1, (char *)recvBuf, 0, 0);
?????? }
?????? if( tpcommit(0) == -1)
?????? {
????????????? userlog(“tpcommit()fail:%s”, tpstrerror(tperrno));
????????????? tpreturn(TPFAIL,-1, (char *)recvBuf, 0 ,0);
?????? }
userlog(“Transaction committedsuccessfully”);
tpreturn(TPSUCCESS, 0 , (char *)recvBuf,0 , 0);
}
本例中的TRANSFER交易使用了TUXEDO XA事務API;本例使用了TUXEDO的NULL TMS配置。當TRANSFER被調用,首先起一個事務,調用交易WITHDRAWAL,然后調用交易DEPOSIT。如果一切都運行成功,TRANSFER調用tpcommit()結束事務。任何錯誤都將導致RM回滾事務。
?
?
?
?
?
?
管理類API AdminAPI(MIB)
?
?
?
本節要點
l? 定義
l? 過程
l? 代碼例子
l? 錯誤處理和管理類API域
簡介
?????? 在TUXEDO下管理應用有很多手段,如下:
2? tmadmin
2? tmadmin的腳本
2? 調用ATMI
2? X-Windows GUI
2? JAVA applet Web GUI
2? Admin API (MIB)
每一種方法都有其優點和適用場合。Admin API提供訪問TUXEDO信息的控制方法和結構。這些信息被分類成組,稱為管理信息庫(Management Information Base—MIB)。通過Admin API可以訪問MIB。使用AdminAPI有以下優勢:
2? 可訪問的TUXEDO系統信息更多
2? 管理應用有更高的靈活度
2? 可以集成到外部系統工具中
?
AdminAPI(MIB)
?????? TUXEDO系統組成的各個部分都有自己的MIB,每部分的MIB是一組相關的類,每個類代表一個MIB可管理的實體或項目,有其自身的屬性、許可權限和語義。TUXEDO系統的MIB有5部分,如下:
2?TM_MIB
2?EVENT_MIB
2?APPQ_MIB
2?WS_MIB
2?ACL_MIB
下邊的例子是訪問TM_MIB并顯示了/T部分的管理信息庫。
?
范例
?????? AdminAPI使用了一些預定義的FML32的域,這些數據組織存放在文件$TUXEDO/udataobj/tpadm中。環境變量必須設置如下:
?????? FLDTBLDIR32=$TUXDIR/udataobj
?????? FIELDTBLS32=Usysfl32,tpadm,evt_mib
?????? ExportFLDTBLDIR32 FIELDTBLS32
使用AdminAPI的代碼范例
#include <stdio.h>
#include <fml32.h>
#include <atmi.h>
#include <tpadm.h>
main(int argc, char **argv)
{
?????? longblen;
?????? FBFR32????? *ibuf;
?????? /*tpinit() 連接TUXEDO */
?????? ibuf= (FBFR32 *)tpalloc(FMLTYPE32,NULL,0);
?????? Fchg32(ibuf,TA_OPERATION,0,”GET”,0);
?????? Fchg32(ibuf,TA_CLASS,0,”T_MACHINE”,0);
?????? printf(“Queryth T_MACHINE class before:\n”);
?????? Fprint32(ibuf);
?????? printf(“\n”);
?????? if(tpcall(“.TMIB”,(char *)ibuf,0,(char **)&ibuf,&blen,0)== -1){
????????????? printf(“tpcall(.TMIB)failed:%s\n”,tpstrerror(tperrno));
????????????? Fprint32(ibuf);
????????????? Return(-1);
?????? }
?????? printf(“Queryth T_MACHINE class after:\n”);
?????? Fprint32(ibuf);
?????? printf(“\n”);
?????? tpfree((char*)ibuf);
?????? tpterm();
?????? return(0);
}
因為Admin API是基于FML32類型的數據,所以要包含TUXEDO系統頭文件“fml32.h”。
因為Admin API要用一些預定義的域去訪問MIB信息,如TA_OPERATION和TA_CLASS,所以要包含TUXEDO系統頭文件“tpadm.h”。
用tpinit()連接TUXEDO系統。
分配一個FML32數據緩沖。
在本例中,我們通過“GET(ing)”得到“MACHINE”的信息。
用tpcall()調用.TMIB服務。
顯示結果。
釋放FML32緩沖。
切斷連接。
本例的輸出(域名和域值)
TA_ERROR???????????? 0
TA_MORE??????????????? 0
TA_OCCURS????????? 1
TA_PERM??????????????? 438
TA_GID??????????????????????????? 302
TA_MAXACCESSERS 20
TA_MAXCONV???????????????????? 1
TA_MAXGTT?????????????????? 20
TA_MAXWSCLIENTS?? 0
TA_MINOR????????????????????? 6000
TA_RELEASE??????????????? 60
TA_SPINCOUNT?????????? 0
TA_TLOGSIZE?????????????? 100
TA_TMNETLOAD????????? 0
TA_UID?????????????????????????????????? 261
TA_MAXCLCACHE???????????? 100
TA_CLASS??????????????????????????? T_MACHINE
TA_STATE????????????????????? ACTIVE
TA_APPDIR??????????????????? /usr/apps/atmapp
TA_CMPLIMIT??????????????? MAXLONG,MAXLONG
TA_ENVFILE????????????????? /usr/apps/atmapp/ENVFILE
TA_PMID???????????????????????? lcspn1
TA_TLOGDEVICE???????? /usr/apps/atmapp/logs/TLOG
TA_TLOGNAME???????????? TLOG
TA_TUXCONFIG?????????? /usr/apps/tuxconfig
TA_TUXDIR???????????? ?????? /usr/tuxedo
TA_TYPE??????????????????????? RS6000
TA_ULOGPFX??????????????? /usr/apps/atmapp/logs/ULOG
TA_LMID???????????????????????? SITE1
?
其他Admin API域和錯誤處理
?
?????? 除基本的域外,其他一些Admin API域在管理MIB信息時也非常有用。如:
在一個大應用中,server節會包含很多條目,以下3個域在取得這些信息時很有用。
?
| TA_OCCURS | 在請求時,表示需要得到信息的行數。 在返回結果后,表示成功得到信息的行數。 | 
| TA_CURSOR | 表示上一次GET操作停止的位置。配合TA_OPERATION的GETNEXT屬性,可以順序遍歷MIB。 | 
| TA_FILTER | 客戶端程序可以通過該域得到一個特定域信息 | 
?
?????? 使用AdminAPI發生錯誤時,在回應緩沖中會帶回來自MIB的錯誤信息
?
| TA_ERROR | 返回一個長整形操作結果值,參見診斷信息 | 
| TA_STATUS | 用文本格式描述錯誤 | 
| TA_BADFLD | 如果有一個域發生錯誤,用一個長整形值描述出錯的FML32域 | 
?
代碼范例
/* 得到前3項 */
long n=3;
Fchg32(sendbuf,TA_OPERATION,0,”GET”,0);
Fchg32(sendbuf,TA_CLASS,0,”T_SERVER”,0);
Fchg32(sendbuf,TA_OCCURS,0,n,0);
Fchg32(sendbuf,TA_CURSOR,0,NULL,0);
/* 打印rpbuf中返回值*/
ret = tpcall(“.MIB”,(char*)sendbuf,0,(char **)&recvbuf,&len,0);
/* 如果出錯打印TA_ERROR和TA_STATUS*/
if ( ret == -1 && tperrno ==TPESVCFAIL){
?????? Fget32(recvbuf,TA_ERROR,0,(char*)&ta_error,NULL);
?????? Ta_status=Ffind32(recvbuf,TA_STATUS,0,NULL);
?????? Printf(“Failure:%ld,%s\n”,ta_error,ta_status);
}else
?????? Fprint32(recvbuf);
/* 從recvbuf傳遞TA_CURSOR,得到下3項*/
Fget(recvbuf,TA_CURSOR,0,cursor,0);
Fchg32(sendbuf,TA_OPERATION,0,”GETNEXT”,0);
Fchg32(sendbuf,TA_CURSOR,0,cursor,0);
?
tpadmcall()
?
tpadmcall(FBFR32 *inbuf, FBFR32 **outbuf,long flags)
?
用法:
?
| Unbooted App Unconfigured App | ?用戶是管理員,用于SET一個NEW T_RESOURCE類,然后定義一個初始配置給應用 | 
| Unbooted App Configured App | 在有權限的UID/GID情況下,GET并SET任何TM_MIB(5)中任何類的任何屬性。 | 
| Booted App Unattached Process | 在有權限的UID/GID情況下或用戶是管理員,當返回值不是ACTIVE時,可以GET任何TM_MIB(5)中有合適權限的任何類的任何屬性。 | 
| Booted App Attached Process | 權限在tpinit()時由授權key決定,可以GET任何TM_MIB(5)中有合適權限的任何類的任何屬性。 | 
?
?
代碼范例:
?
#include <stdio.h>
#include <fml32.h>
#include <atmi.h>
#include <tpadm.h>
main(int argc , char **argv)
{
FBFR32????? *ibuf;
?????? /*tpinit() 連接TUXEDO */
?????? ibuf= (FBFR32 *)tpalloc(FMLTYPE32,NULL,0);
?????? Fchg32(ibuf,TA_OPERATION,0,”GET”,0);
?????? Fchg32(ibuf,TA_CLASS,0,”T_DOMAIN”,0);
?????? printf(“Queryth T_DOMAIN class before:\n”);
?????? Fprint32(ibuf);
?????? printf(“\n”);
?????? if(tpadmcall(ibuf,&ibuf,0)== -1){
????????????? printf(“tpadmcall()failed:%s\n”,tpstrerror(tperrno));
????????????? Fprint32(ibuf);
????????????? Return(-1);
?????? }
?????? printf(“Queryth T_MACHINE class after:\n”);
?????? Fprint32(ibuf);
?????? printf(“\n”);
?????? tpfree((char*)ibuf);
?????? tpterm();
?????? return(0);
}
?
?
?
?
安全??????? Security
簡介
?????? TUXEDO在其系統框架中集成了進程間通訊安全功能。在商業應用中可以由用戶決定安全級別。
?????? 本節中,我們將討論TUXEDO提供的不同的安全保障能力和應用實現的必要步驟。
?
?
?
?
?
本節要點
l? 概念
l? 管理文件和命令
l? ubbconfig
l? API使用說明
l? 代碼范例
概念
?????? TUXEDO系統在第一次ATMI調用時——tpinit()就進行安全工作。
?????? 安全級別信息先傳入tpinit(),在公告牌上進行校驗,然后用AUTHSVR進行二次檢查。如果驗證通過,tpinit()允許客戶端連上TUXEDO系統。
?????? TUXEDOAPI tpchkauth()用來決定應用的安全級別。下表是各安全級別認證需要的資源。
| tpchkauth()的返回值 | 管理文件設置 | UBBCONFIG的設置 | 
| TPNOAUTH | ? | ? | 
| TPSYSAUTH | ? | SECURITY APP_PW | 
| TPAPPAUTH | tpusr tpgrp tpacl | SECURITY USERAUTH ACL MANDATORY_ACL AUTHSVC AUTHSVC | 
?
?
?
?
?
?
相關管理命令
組命令
tpgrpadd –g GID groupname
tpgrpdel groupname
tpgrpmod –g GID –n new_groupnamegroupname
入口在$APPDIR/tpgrp
用戶命令
tpusradd –u UID –g GID –c clntnameusrname
tpusrdel –c clntname
tpusrmod –u UID –g GID –c clntname –lnewlogin –n newclntname –p usrname
入口在$APPDIR/tpusr
ACL命令
tpacladd –g GID entity_name
tpacldel entity_name
tpaclmod –g GID entity_name
入口在$APPDIR/tpacl
簡要說明
?????? 以上管理命令維護AUTHSVR的安全入口。只有安全級別要求到ACL(Access Control List)時,這些操作過程才是必須的。
?????? AUTHSVR對每一個用戶進行認證。當客戶端進程調用tpinit()去連接應用時,發生以下過程:
AUTHSVR校驗用戶名,客戶端名和密碼
當成功,AUTHSVR提供一不可偽造的應用key
每次交易請求時,客戶端都要提交此應用key
?
ubbconfig有關安全的部分
*RESOURCES
AUTHSVC? “..AUTHSVC”
SECURITY “ACL”
*SERVERS
AUTHSVR? SVRGRP=”AUTHGRP”SRVID=100
???????????????????? RESTART=YMAXGEN=2 GRACE=0
???????????????????? CLOPT=”-A”
AUTHSVR提供的交易名字叫“..AUTHSVC”
SECURITY設置了安全的級別
?
客戶端代碼范例
#include “atmi.h”
int?? ConnectToTuxedo()
{
?????? FBFR?? *f;
?????? TPINIT? *tpinfo;
?????? char???????????? *passwd2=”penquin”;
?????? int?? do_auth = 0,no_auth = 0;
?????? do_auth= tpchkauth();
?????? switch(do_auth)
?????? {
?????? case????? -1:
????????????? printf(“tpchkauth()err:%s”,tpstrerrno(tperrno));
????????????? return(-1);
?????? case????? TPNOAUTH:
????????????? no_auth= 1;
????????????? break;
?????? case????? TPSYSAUTH:
????????????? tpinfo= (TPINIT *)tpalloc(“TPINIT”, NULL, 0);
????????????? if(tpinfo ==NULL)
????????????? {
???????????????????? printf(“tpchkauth()err:%s”,tpstrerrno(tperrno));
???????????????????? return(-1);
????????????? }
????????????? break;
?????? case????? TPAPPAUTH:
????????????? tpinfo= (TPINIT *)tpalloc(“TPINIT”, NULL, TPINITNEED(15));
????????????? if(tpinfo ==NULL)
????????????? {
???????????????????? printf(“tpchkauth()err:%s”,tpstrerrno(tperrno));
???????????????????? return(-1);
????????????? }
????????????? tpinfo->datalen=strlen(passwd)+1;
????????????? memcpy((char*)&tpinfo->data, passwd2, tpinfo->datalen);
????????????? break;
?????? default:
????????????? printf(“Invalidsecurity setting %d\n”,do_auth);
????????????? return(-1);
?????? }
?????? if(!no_auth)
?????? {
????????????? strcpy(tpinfo->usrname,”tuxedo”);
????????????? strcpy(tpinfo->passwd,”hello”);
????????????? strcpy(tpinfo->grpname,”“);
?????? }
?????? if((tpinit(TPINIT *)tpinfo))==-1
?????? {
????????????? printf(“Failedto join application\n”);
????????????? return(-1);
?????? }
}
tpchkauth()返回TPNOAUTH,TPSYSAUTH,TPAPPAUTH或錯誤用以決定加密強度。
tpalloc()將分配一個TPINIT結構,存儲與公告牌對比的密碼。
Struct TPINIT {
char????? usrname[MAXTIDENT+2]; 
 char????? cltname[MAXTIDENT+2];
 char????? passwd[MAXTIDENT+2];
 char????? grpname[MAXTIDENT+2];
 long????? flags;
 long????? datalen;
 long????? data;
}
?
?????? tpalloc()還將根據TPINITNEED()分配一段空間存儲用戶密碼。
?????? 用tpinit()與TUXEDO連接。
?
?
?
?
事件代理?????? Event Broker
簡介
?????? 在事件代理出現前,所有的通訊由用戶發起。通過事件代理,TUXEDO系統增加了另一種進程間通訊方式——通訊可以由事件發起。事件可以獨立于客戶端,促使其他活動發生。
?????? 事件代理搜尋并報告一些預定義的事件,如系統錯誤和用戶定義錯誤。
?????? 在本節中,我們將研究事件監視模塊,練習TUXEDO的’publish’和’subscribe’事件模塊的程序設計。
??????
?
本節要點
l? ubbconfig范例
tpsubscribe和tpunsubscribe的代碼范例
tppost的范例
概念
?????? 事件代理提供了這樣一種通訊方式:一些進程可以發布消息給訂閱了這些消息的進程或客戶端。例如:服務可以在價格發生變化時發布信息,所有連接系統的客戶端都可以收到信息。
?????? 事件代理只能執行一些該事件預定動作,這些動作包括:
2? 調用交易(tpacall)
2? 將請求送入一個可靠隊列(tpenqueue)
2? 用戶通知之類(tpnotify)
2? 記錄日志到ULOG.mmddyy
2? 執行系統調用
主要有2類事件:
2? 系統???????????? TUXEDO系統內部活動引起,如網絡故障等
2? 用戶定義???? 應用中與業務流程有關的
觸發事件的ATMI API是tppost()。
訂閱和取消訂閱的ATMI API是tpsubscribe(),tpunsubscribe()。
?
?
Subscribing&? Unsubscribing ATMI
?
longtpsubscribe(char *eventexpr, char *filter, TPEVCTL *ctl, long flags)
?
進行訂閱。返回訂閱句柄,-1失敗
char *eventexpr?????? 表示事件的字符串,可以含有通配符*
char *filter????????? 一個布爾表達式,決定是否收到消息。
TPEVCTL ctl???? 一個描述事件代理將進行的動作
flags?????????????????? 可以是[TPNOTIME|TPSIGRSTRT|TPNOBLOCK]
?
inttpunsubscribe(long subscription, long flags)
?
取消訂閱
long eventexpr tpsubscribe()返回的句柄
flags?????????????????? 可以是[TPNOTIME|TPSIGRSTRT|TPNOBLOCK]
?
struct TPEVCTL
?
?{
?????? longflags;
?????? charname1[32];
?????? charname2[32];
?????? TPQCTLqctl;
}
調用另一個交易
ctl->flags=TPEVSERVICE;
strcpy(ctl->name1,”SERVICENAME”);
進入隊列
ctl->flags=TPEVQUEUE;
strcpy(ctl->name1,”QSPACENAME”);
strcpy(ctl->name2,”QUEUENAME”);
ctl->qctl.flags=TPQREPLYQ;
strcpy(ctl->qctl.replyqueue,”RPLYQ”);
通知
ctl=(struct TPEVCTL *)NULL;
int tppost(char *eventname, char *data,long len, long flags)
tpsubscribe()和tpunsubscribe()的范例代碼
#include <atmi.h>
static long sub_serv;
int tpsvrinit(int argc, char **argv)
{
?????? TPEVCTLevctl;
?????? /*連接TUXEDO系統——tpinit() */
?????? evctl.flags=TPEVSERVICE;
?????? strcpy(evctl.name1,”BANK_MANAGER”);
?????? sub_serv=tpsubscribe(“BANK_TLR_WITHDRAWAL”,
”AMOUNT>300.00”,&evctl,TPSIGRSTRT);
?????? if(sub_serv == -1)
return(-1);
}
int tpsvrdone()
{
?????? if(tpunsubscribe(sub_serv,TPSIGRSTRT)== -1)
?????? {
????????????? printf(“Errorunsubscribing to service event\n”);
?????? }
}
建立一個服務調用訂閱事件,被調用服務是BANK_MANAGER,當交易BANK_TLR_WITHDRAWAL的AMOUNT域的值大于300.00觸發。
?????? 用tpunsubscribe()取消訂閱。
?
tppost()的范例代碼
?
void WITHDRAWAL(TPSVCINFO *transb)
{
……
?????? if(amt > 300.00)
?????? {
????????????? if( (Fchg(transf,EVENT_NAME,0,”BANK_TLR_WITHDRAWAL”,0)<0) ||
(Fchg(transf,EVENT_NAME,0,gettime(),0)<0)||
(Fchg(transf,EVENT_NAME,0,(char*)&amt,0)<0) ))
????????????? {
???????????????????? sprintf(emsg,”Fchg(eventflds) failed :%s”,Fstrerror(Ferror));
????????????? }elseif( tppost(“BANK_TLR_WITHDRAWAL”,(char *)transf,0L,
TPNOTRAN|TPSIGRSTRT)<0)
????????????? {
???????????????????? if(tperrno!=TPENOENT)
???????????????????? {
??????????????????????????? sprintf(emsg,”tppost()failed :%s”,tpstrerror(tperrno));
???????????????????? }
????????????? }
????????????? if( strcmp(emsg,””)!=0)
????????????? {
???????????????????? userlog(“WARN:EventBANK_TLR_WITHDRAWAL not posted:%s”
,emsg);
???????????????????? strcpy(emsg,””);
????????????? }
?????? }
}
從傳入FML中分離交易金額;增加交易過濾規則:金額>300.00,給FML域賦值;調用tppost()。
?
?
?
?
?
?
?
?
Ubbconfig相應改變
*SERVERS
TMSYSEVT????????????? SRVGRP=EVTGRP1??? SRVID=100
??????????????????????????? RESTART=YMAXGEN=5 GRACE=3600
??????????????????????????? CLOPT=”-A?-- -f tmsysevt.dat”
TMUSREVT????? SRVGRP=EVTGRP1??? SRVID=150
??????????????????????????? RESTART=YMAXGEN=5 GRACE=3600
??????????????????????????? CLOPT=”-A? -- -f tmusrevt.dat”
?
TMUSREVT????? SRVGRP=EVTGRP1??? SRVID=200
??????????????????????????? RESTART=YMAXGEN=5 GRACE=3600
??????????????????????????? CLOPT=”-A? -- -S –p 120”
TMSYSEVT????????????? 系統事件代理服務進程
TMUSREVT????? 用戶事件代理服務進程
-f???? 指定了包含訂閱信息的數據文件
-S?? 表示有第二事件代理,-p決定其輪循時間(單位:秒)
?
?
消息隊列??? Queued Message
?
本節要點
l? 定義
l? 基本隊列
l? 隊列設定—qmadmin
l? 高級隊列
l? 交易和管道
l? ubbconfig
l? 代碼范例
?
可靠隊列
?????? 當進程通過消息方式進行通訊時,消息在被取用前存儲的地方稱為消息隊列。這些隊列是一些存儲空間,或者是內存(IPC消息隊列),或在硬盤上。內存中的隊列在寫硬盤前可以清除;這樣,在主機故障時,就有丟失信息的風險。基于硬盤的隊列可以在主機或網絡癱瘓時可靠地保存信息,代價是讀寫硬盤的開銷。
?????? 商業上用隊列方式使任務可以同步完成。一般地,商業系統需要保證系統總是穩定可靠,良好地完成任務。傳統上是使用昂貴的容錯系統達到此目標,花費主要是在冗于硬件上,使用隊列,往往只要復制部分系統就能達到此效果。
?
?
?
?
?
概念
?????? 作為請求/應答通訊方式的一種替代,可靠隊列允許商業應用通過同步或時序方式使用可靠存儲隊列進行通訊。BEA TUXEDO /Q提供了這種機制。
?????? 其特性提供優點如下:
2?可靠傳遞
2?同步的、自由處理
2?審計、恢復
/Q ATMI通過按照2段式XA事務協議操作,保證可靠的傳輸,并且有內建的錯誤處理能力處理意外情況。
?
?
基本隊列
?????? /Q提供的API簡單而功能強大,有以下兩個函數:
2?tpenqueue() – 將消息置入隊列
2?tpdequeue() – 從隊列中得到消息
?????? 隊列由BEATUXEDO管理員創建,定義隊列并指定大小。隊列全部位于隊列空間,隊列空間的名字是函數參數之一。每個隊列都有一個名字,函數通過名字調用隊列。
tpenqueue()參數如下:
2?隊列空間名
2?隊列名
2?包含置入隊列信息的結構
2?置入隊列的數據緩沖
2?長度
2?控制標志
tpenqueue(qspace,qname,control_info,buffer,len,flags)
tpdequeue()參數如下:
2?隊列空間名
2?隊列名
2?包含取隊列信息的結構
2?取隊列的數據緩沖
2?長度
2?控制標志
tpdequeue(qspace,qname,control_info,buffer,len,flags)
?
?
qmadmin范例
?????? qmadmin是一個命令行工具,TUXEDO /Q的一個部分,使管理員可以建立基于硬盤的的隊列;qmadmin用于在設備上建立、初始化、列出和刪除隊列和隊列空間。
$qmadmin
QMCONFIG=/usr/apps/atmapp/QUE
>crdl /usr/apps/atmapp/QUE
Starting Offset :0
Size in disk pages:400
Created decice/usr/apps/atmapp/QUE,offset 0,size 400
>qspacecreate
Queue space name:QSPACE
IPC Key for queue space:62639
Size of queue space in disk space:100
Number of queues in queue space:6
Number of concurrent transaction in queuespace:4
Number of concurrent processes in queuespace:9
Number of messages in queue space:3
Error queue name:errque
Initialize exter\nts(y,n[default=n]):y
Blocking factor[default=16]:16
>qopen QSPACE
>qcreate
Queue name:DEPOSIT
Queue order(priority,time,fifo,lifo):fifo
Out-of-ordering enqueuing(top,msgid):none
Retries[default=0]:2
Retry dela in seconds[default=0]:30
High limit for queue capacity warning:80%
Reset(low)limit for queue capacitywarning:0%
Queue capacity command:
No default queue capacity command
Queue ‘DEPOSIT’ created
>qcreate
Queue name:REPLYQ
Queue order(priority,time,fifo,lifo):fifo
Out-of-ordering enqueuing(top,msgid):none
Retries[default=0]:2
Retry dela in seconds[default=0]:30
High limit for queue capacity warning:80%
Reset(low)limit for queue capacitywarning:0%
Queue capacity command:
No default queue capacity command
Queue ‘REPLYQ’ created
說明:
用crdl命令在/usr/apps/atmapp/QUE上建立一個400頁的設備
用qspacecreate命令在設備上建立一個100頁的隊列空間QSPACE,有6個隊列。
用qopen命令打開隊列空間QSPACE。
用qcreate命令在隊列空間QSPACE上建立隊列DEPOSIT,FIFO方式,消息可以取出2次。同樣建立隊列REPLYQ。
?
?
高級隊列
?????? 每個隊列都有與之相關的一些控制信息;其中絕大多數內容由應用設定,但是有些由BEA TUXEDO隊列軟件直接設定。
隊列次序
?????? 缺省的,消息進出隊列的次序由管理員確定,一般是先入先出(FIFO-first in first out);但有時消息不需要立即處理,這樣就需要其他的隊列次序。BEA TUXEDO提供了幾種方案解決之,有:
2? 按優先級
2? 按時序
2? 先進先出
2? 后進先出
管理員甚至可以合并使用上述幾種方式決定隊列次序。
按時釋放
?????? 當一個消息進隊列時,程序員可以決定其在某時間前不可出隊列。這個時間可以是一個定值(如:1月7號下午2點)或相對于入隊列的時間。當程序試圖出隊列時,那些‘還沒到時間’的消息是不可見的。例:
control_info->deq_time=3600;/* 3600秒后才可以出隊列*/
control_info->flags=TPQTIME_REL;/* 表示相對時間值被設定*/
TPQCTL結構
TPQCTL結構用來控制一個消息如何進/出隊列
struct tpqctl{
?????? long??? flags;
?????? long????? deq_time;
?????? long????? priority;
?????? long??? diagnostic;
?????? char????? msgid[TMMSGIDLEN];
?????? char????? corrid[TMCORRIDLEN];
?????? char????? replyqueue[TMQNAMELEN+1];
?????? char????? failurequeue[TMQNAMELEN+1];
?????? CLENTID??? cltid;
?????? long????? urcode;
?????? long????? appkey;
};
tpenqueue的flags有如下可能:
TPNOFLAGS,TPQPRIORITY,TPQCORRID,[TPQTOP|TPQBEFOREMSGID],[TPQTIME_ABS|TPQTIME_REL], TPQREPLYQ,TPQFAILUREQ
tpdequeue的flags有如下可能:
TPNOFLAGS,TPQWAIT,[TPQGETBYMSGID|TPQGETBYCORID]
本節中有定義:
typedef struct tpqctl TPQCTL;
優先級
?????? 一條消息可以被設置一個優先級;優先級決定消息相對于隊列中其他消息的位置。高優先級的消息較靠近隊列頭,可以較早出隊列。例:
control_info->priority=100;? /*設入隊列優先級為最高級*/
control_info->flags=TPQPRIORITY;????? /* 表示優先級的值已經設定*/
返回和錯誤隊列
?????? 在將消息入隊列前,程序可以定義兩個隊列:返回隊列和錯誤隊列。當消息出隊列時,這些隊列中存有原消息的處理結果:返回或錯誤消息。
相關標識
?????? 應用可以在消息上加一個‘標記’,當消息被從一個隊列移動到另一個隊列并被應用的不同部分處理時可以識別它。這些標記被稱為‘相關標識’。
超次序
?????? 雖然隊列被定義了一個固定的出/入次序,但有時應用需要超越這個次序。BEA TUXEDO的隊列工具允許管理員配置程序入隊列時可以超越次序的隊列。
2?可以將一條消息置于隊列頭
2?可以將一條消息置于特定消息前
錯誤診斷
如果tperrno被設成TPEDIAGNOSTIC,則TPQCTL結構中的診斷域將被設成一個錯誤狀態,有以下:
2?QMEINVAL????????????? 調用時使用了非法標志值
2?QMEDADMSGID??? 非法錯誤消息ID
2?QMENOMSG??? 隊列沒有可以取出的消息
2?QMEINUSE????????????? 隊列中有消息,但現在不可用
?
事務和管道
事務
?????? 事務是一種保證一系列操作全部成功或全部失敗的機制;通常用來保證對數據庫的多次操作全部完成。
?????? BEATUXEDO可以協調本隊列修改、其他隊列修改和數據庫系統操作。當程序調用tpdequeue()將一條消息出隊列時,事實上消息僅在程序事務確認時才從隊列中除去。如果事務回滾或超時,消息仍在隊列中;可以再次操作。系統從而有效地保障該消息僅被處理一次。
?????? TMQUEUE是一個BEATUXEDO系統提供的當程序調用tpenqueue()和tpenqueue()時將消息入、出隊列的服務。tpenqueue()和tpenqueue()的第一個參數是隊列空間名;該名字必須由TMQUEUE的一個交易發布過。
管道
?????? TMQFORWARD是BEATUXEDO提供的將消息通過調用tpenqueue()將消息前轉的服務。
?????? 消息將被發送到一個有與讀出隊列名匹配的交易的服務。消息將在一個事務中出隊列并送給服務。如果交易失敗,事務回滾、消息將被送回隊列,可以重試的次數決定于隊列配置;如果達到了限制次數,消息將送入隊列空間的錯誤隊列。
ubbconfig的相應改變
*GROUPS
QUE1?? LMID=SITE1???? GRPNO=2
????????????? TMSNAME=TMS_QM?? TMSCOUNT=2
????????????? OPENINFO=”TUXEDO/QM:/apps/atmapp/QUE:QSPACE”
*SERVERS
TMQUEUE??????? SRVGRP=QUE1???? SRVID=1
????????????? CLOPT=”-sQSPACE:TMQUEUE –“
TMQFORWARD????? SRVGRP=QUE1???? SRVID=5
????????????? CLOPT=”---I 2 –q DEPOSIT”
說明:
?????? 每個隊列空間需要單獨創建一個組,本例中為QUE1。TMSNAME是事務管理服務的名字。TMCOUNT決定最少啟動幾個TMS_QM服務。
?????? TMQUEUE是處理tpenqueue()將請求置入隊列的/Q服務。TMQFORWARD是將請求出隊列并通過tpcall()將請求送相應的交易。-i決定再次讀隊列前應該延遲的秒數。-q決定前轉請求的來源隊列。
客戶端代碼范例
#include <stdio.h>
#include <atmi.h>
main()
{
?????? char *reqstr;
?????? long len;
?????? TPQCTL qctl;
?????? /* 用tpinit()連接TUXEDO*/
?????? qctl.flags = TPQREPLYQ;
?????? strcpy(qctl.rplyqueue,”RPLYQ”);
?????? if (tpenqueue(“QSPACE”,”TOUPPER”,&qctl,reqstr,0,0)== -1)
{
????????????? printf(“tpenqueue(TOUPPER):%s\n”,tpstrerror(tperrno));
?????? if(tperror ==TPEDIAGNOSTIC)
{
????????????? printf(“Queuemanager diagnostic %ld\n”,qctl.diagnostic);
}
?????? tpfree(reqstr);
?????? tpterm();
?????? exit (-1);
}
?????? sleep(10);
?????? qctl.flags = TPQWAIT;
?????? if(tpdequeue(“QSACE”,?“REPLYQ”,&qctl,&reqstr,&len,TPNOTIME) == -1)
{
????????????? printf(“tpdequeue(REPLYQ):%s\n”, tpstrerror(tperrno));
?????? if (tperrno ==TPEDIAGNOSTIC)
{
????????????? printf(“Queuemanager diagnotic %ld\n”, qctl.diagnostic);
}
?????? tpfree(reqstr);
?????? tpterm();
?????? exit(-1);
}
?????? printf(“after:%s\n”,reqstr);
?????? tpfree(reqstr);
?????? tpterm();
?????? return (0);
}
會話 Conversations
?
本節要點
l? 簡介
l? 定義
l? ATMI
l? UBBconfig
簡介
?????? 作為對呼叫/應答方式的補充,TUXEDO提供了一種稱為會話的通訊方式。該方式用于客戶端和服務端需要進行大量、多次數據傳輸并保持連接時。在一個會話過程中雙方會有多次發送和接收。例如,一對客戶端/服務端之間傳誦一個大的數據庫查詢結果游標時,需要進行幾次傳輸。
?????? 在呼叫/應答方式中,所有的數據必須在一次通訊中傳遞,不保留任何中間狀態信息。在會話模式中,通訊雙方使用了一種“半雙工”協議。一個進程只能處于發送數據或接收數據狀態之一。該通訊協議中,狀態信息與數據一同傳送。
?????? 會話被用來傳送大量數據,如:
2? 報表
2? 數據/圖形文件傳輸
2? 大型數據庫查詢
此模式必須進行另外的ATMI編程才能實現。以下函數協助實現此種連接:
2?tpconnect() 建立連接
2?tpsend() 發送信息
2?tprecv() 接收信息
2?discon() 撤消連接(出錯時)
在會話持續期間,客戶端被綁定在服務上。不利之處是服務在會話期間不能響應其他請求。
?
ATMI
int tpconnect (char *svc, char *data,long len, long flag)
int tpsend( int cd, char *data, long len,long flag, long *revent)
int tprecev(int cd, char *data, long len,long flag, long *revent)
int tpdiscon(int cd )
?
?
?
?
?
范例
ubbconfig應作的改動
*RESOURCES MAXCONV??????? 域內缺省最大會話數
MACHINES?????? MAXCONV??????? 本機器上最大會話數,可以超越*RESOURCES節定義的域內缺省最大會話數
*SERVERS????????????? CONV=Y?????????? 定義該服務是一個會話方式的服務。
ubbconfig的例子
*RESOURCES
?MAXCONV????? 20
*MACHINES
?lcspn1????????????? TUXDIR=”/usr/tuxedo”
???????????????????? MAXCONV=25
*SERVERS
?audit????????? SRVGRP=BANKB1????? SRVID=1
???????????????????? CONV=Y
???????????????????? CLOPT=”-A”
會話方式的客戶端源程序
main(int argc, char *argv[])
{
int?? ret,cd;?? /* 循環計數器 */
char *buf;??? /* 數據指針 */
long len;??????????? /*長度 */
long revent;?????? /* tpsend 失敗的事件方式 */
?
/* 連接TUXEDO – tpinit() */
if ( buf = (char*)tpalloc(“STRING”,NULL,1024)==NULL)
{
printf(“tpaclloc():%s\n”,tpstrerror(tperrno));
tpterm();
exit(-1);
}
if ( cd =tpconnect(“AUDIT”,NULL,0,TPSENDONLY)==-1)
{
?????? printf(“tpconnect():%s”,tpstrerror(tperrno));
?????? tpfree(buf);
?????? tpterm();
?????? exit(-1);
}
strcpy(buf, “humpty dumpty”);
if (tpsend(cd , buf ,(long)strlen(buf), 0, &revent) == -1)
{
?????? printf(“tpconnect():%s”,tpstrerror(tperrno));
}
strcpy(buf,“mickey mouse”);
if(tpsend(cd , buf ,(long)strlen(buf), 0 , &revent) == -1)
…
if(tpsend(cd , NULL , 0, TPRECVONLY , &revent) == -1)
…
if( tprecv(cd, &buf , &len, 0, &revent) == -1 )
…
tpfree(buf);
tpterm();
}
連接TUXEDO域;
分配一個1K的ATMI緩沖;
使用tpconnect()連接名為’AUDIT’的一個會話交易;
客戶端通過TPSENDONLY將通訊控制權交給服務端。此時無數據傳送。返回的通訊描述符存儲于cd,用來跟蹤綁定在會話上的唯一服務過程;
數據首先被復制到ATMI緩沖中;
數據被發送到會話服務上;
第二部分數據被復制到ATMI緩沖中;
用tpsend()發送到會話服務上;
客戶端用TPRECVONLY標志放棄控制權。此處調用tpsend()沒有發送數據,客戶端準備接收數據;
客戶端用tprecv()接收數據。
會話方式的服務端源程序
voidCONV(TPSVCINFO *rqst)
{
?????? static???? state= SRECV;
?????? long???????????? len,revent;
?????? for ( ; ;)
?????? {
????????????? switch(state)
????????????? {
????????????? case???????????? SRECV:
???????????????????? if ( tprecv(rqst->cd,&buf, &len, 0, &revent ) == -1)
???????????????????? {
??????????????????????????? if ( tperrno == TPEEVENT&& revent == TPEV_SENDONLY)
??????????????????????????? {
?????????????????????????????????? userlog(“statechange from receive to send”);
?????????????????????????????????? state =SSEND;
??????????????????????????? }else
??????????????????????????? {
?????????????????????????????????? tpreturn(TPFAIL,0, rqst->data, 0, 0 );
??????????????????????????? }
???????????????????? }
???????????????????? break;
????????????? case???????????? SSEND:
???????????????????? strcpy(buf, “all done &protocol complete”);
???????????????????? if ( tpsend(rqst->cd,buf, 0, 0, &revent)==-1)
???????????????????? {
??????????????????????????? userlog(“tpsend(%d):%s”,revent,tpstrerror(tperrno));
???????????????????? }else
???????????????????? {
??????????????????????????? userlog(“SENDMESSAGE”);
???????????????????? }
???????????????????? state = SDONE;
???????????????????? break;
????????????? case???????????? SDONE:
???????????????????? tpfree(buf);
???????????????????? tpreturn(TPSUCCESS, 0,rqst->data, 0, 0);
???????????????????? break;
????????????????????
????????????????????
????????????? }
?????? }
}
#define?????? SRECV????????????? 1
#define?????? SSEND????????????? 2
#define?????? SDONE????????????? 3
以上宏定義在程序中用到;
當客戶端剛連接交易時,狀態被設為RECEIVE;
此部分代碼是會話交易在RECEIVE狀態中;
tprecv()用來接收客戶端數據;
協議在以下情況把狀態由RECEIVE轉成SEND:
tprecv()返回-1
tperrno被設成TPEEVNT
revent被設成TPEV_SENDONLY
在狀態變成SEND后,服務可以調用tpsend();
如果協議有“部分”失敗,服務切斷客戶端連接去處理錯誤;
代碼將會話交易狀態轉成SEND;
使用tpsend()發送數據;
在一次數據傳送后,服務狀態被設成DONE;
注意tpreturn用來結束一個成功的會話;tpdiscon()用于出錯時結束會話。
廣播通知Unsolicited Notification
?
本節要點
l? 定義
l? ATMI
簡介
?????? 一般情況下,客戶端發起并控制通訊。TUXEDO額外提供了一種允許客戶端接收消息的通訊方式。該通訊方式的發起方可以是其他客戶端或服務。我們稱之為廣播通知。
?????? 有兩種方式的廣播通知:目標是一個客戶端(通知);目標是多個客戶端(廣播)。
?????? 為接收此種非主動請求信息,客戶端必須指定處理此種信息的回應函數。客戶端通常使用信號傳遞處理信息。而不使用此種方式的客戶端可以通過tpchkunsol(),或DIPIN方法處理此種信息。當任何TUXEDO ATMIAPI 被調用時,DIPIN被定義成此類信息的檢查標志。
?????? 管理員使在系統出錯時用此類信息通知客戶端。此外,該類信息還有其他許多用途。
ATMI
int tpbroadcast(char *lmid, char*usrname, char *cltname, char *data, long length, long flags)
int tpnotify( CLTID *clentid, char *data,long length, long flags)
int tpchkunsol()
void *tpsetunsol( void (* disp) (char*data, long len, long flags)))()
?
范例
ubbconfig中的相應信息
*RESOURCES NOTIFY?????? DIPIN
TUXEDO 將用DIPIN方法與客戶端進行廣播通知方式的通訊。
客戶端使用廣播通知方式通訊的源代碼
#include <atmi.h>
void main()
{
/*作為一個柜員客戶端連接TUXEDO——tpinit()*/
if ( tpsetunsol(unsolfunc)==TPUNSOLERR)
{
?????? printf(“tpsetunsol():%s\n”,tpstrerror(tperrno));
}
…
tpchkunsol();/*在一個輪循中*/
…
tpterm();
}
void unsolfunc(char *data,long len,longflag)
{
?????? printf(“Unsolicitedmessage is %s”,data);
?????? return;
}
客戶端連接TUXEDO域;
客戶端登記回應函數,unsolfunc,當收到廣播通知的信息時觸發;
客戶用tpchkunsol()端輪循處理信息;
接下來是回應函數的定義;
在本例中,廣播通知的信息是一個字符串,客戶端將其打印出來。
?
服務端廣播通知消息的源代碼
void UNSOL(TPSVCINFO *incoming)
{
?????? char*data;
?????? if(data = (char *)tpalloc(“STRING”,NULL,1024)==NULL)
?????? {
????????????? userlog(“Errorallocating buffer”);
?????? }
?????? strcpy(data,”Thisdata will be sent to clents”);
?????? if(tpnotify(&incoming->cltid,data,0,0) == -1)
?????? {
????????????? userlog(“tpnotify():%s”,tpstrerror(tperrno));
?????? }
?????? if(tpbroadcast(“SITE1”,NULL,”TELLER”,0,0)==-1)
?????? {
????????????? userlog(“tpbroadcast():%s”,tpstrerror(tperrno));
?????? }
?????? tpreturn(TPSUCCESS,0,incoming->data,0, 0);
}
廣播通知信息必須使用ATMI緩沖,所以,先分配一個ATMI緩沖。
用tpnotify()發送消息給請求了UNSOL交易的客戶端。
服務使用tpbroadcast()將同一消息發送到SITE1上所有以TELLER登錄的用戶。
?
?
?
?
?
?工作站的客戶端workstation Client
簡介
BEA TUXEDO 的/WS部分實際上是工作站擴展件。此前,所有的客戶端平臺都是運行著TUXEDO系統的UNIX,這就限制了TUXEDO的客戶端只能運行于UNIX平臺。在今天是不可思議的。
?????? /WS通過以下幾點突破了以上限制:
2?允許遠端不需公告牌即可運行
2?不需要TUXEDO系統域資源
2?不限制客戶端的平臺
2?服務器上無進程對客戶端的一對一的限制
突破這些限制后,服務器不再考慮客戶端的表示,不必管理大量的客戶端進程而專注于TUXEDO和應用服務,大大擴展了系統的可伸縮性。
本節中,我們開始研究/WS應用。
?
?本節要點
l? 定義
l? 過程
l? 改變ubbconfig
l? 網絡阻塞
l? buildclient
概念
?????? 遠程/WS客戶端(WSC)可以是UNIX或WINDOWS客戶端。所有的客戶端與TUXEDO通過工作站監聽進程(WSL-Workstation Listener)和工作站處理進程(WSH-WorkstationHandler)進行通訊。
?????? 當客戶端進行tpinit()或tpchkauth()調用時,進程讀取本地環境變量WSNADDR。該變量應該與監聽連接請求的WSL進程的地址相符。地址值設定在WSL可執行服務的CLOPT的參數中。
?????? WSL進程處理請求,將WSC的網絡地址通知WSH進程。WSH進程處理WSC與TUXEDO系統的進一步通訊。
?????? WSH將請求發給合適的服務并將結果返回WSC。如果交易在遠程機器上,WSH將請求發給BRIDGE,由它將請求前轉到合適的節點。
??????
??????
?
ubbconfig的相應變化
*RESOURCES
?NOTIFY ?? DIPIN
*MACHINES
?SITE1
?????? …
?????? MAXWSCLIENTS=150
?????? …
?SITE2
?????? …
?????? MAXWSCLIENTS=0
*SERVERS
?WSL SRVGRP=”BANKB1” SRVID=500 RESTART=Y
?????? CLOPT=”-A–
??????????????????????????? -n//lcspn1:3060
??????????????????????????? -d/dev/xti/tcp
??????????????????????????? -m2 –M 7 –x 5 –I 5 –T 60”
通知客戶端的方式設為“DIPIN”,使用Windows的消息仿UNIX信號,若消息為WM_TIMER則對應tpchkunsol()。
MAXWSCLIENTS表示該機最多允許連接的工作站數目。
工作站監聽進程啟動參數如下:
-n?? 指定交易請求連接TUXEDO應用環境的監聽進程的主機名和端口號。格式如下:
?????? //lcspn1????????????? 主機名
?????? :???????????????? 間隔符
?????? 3060??????????? 端口號
-d??? WSL和WSH用于傳遞ATMI數據的的設備
-m tmboot最少啟動的WSH進程數
-M?? tmboot最多啟動的WSH進程數
-x??? 每個WSH支持的工作站數
-I???? 工作站連接應用許可的最大耗時
-T??? 無響應連接許可時間
?
?
PC上的環境變量設置
set TUXDIR=C:\TUXEDO
set WSNADDR=//lcspn1:3060
set WSDEVICE=/dev/xti/tcp
set WSENVFILE= C:\ENV4WS
set WSTYPE=DIFF
set TMPDIR= C:\tmp
set WSRPLYMAX=64K
set APP_PW=HOMERUN
注意:WSNADDR可以是一些由逗號隔開的使用相同端口的地址,或由豎線隔開自由選擇端口。例:
WSNADDR=//lcspn1:3050,//lcspn2:3050??
WSNADDR=(//lcspn1:3050|//lcspn2:3050)
?
TUXDIR??????????????????? TUXEDO系統軟件位置
WSNADDR???????????????????? WSL網絡地址
WSDEVICE??????????????????? 網絡設備
WSENVFILE??????????? 環境變量文件
WSTYPE????????????????? 機器類型,控制編、解碼
TMPDIR??????????????????? 存儲返回的目錄
WSRPLYMAX???????? 應用返回緩沖內存大小
APP_PW????????????????? 應用密碼
編譯:
buildclient –w –v –o atmclt –f atmclt.c
-w 表示是WS客戶端,Windows將通過一個DLL去訪問ATMI。
域
簡介
?
/Domain作為TUXEDO的一組件,使獨立的TUXEDO應用可以進行通訊和共享資源。每個應用環境視作一個’domain’。這種結構有以下優點:
l? 仍然可以訪問遠程其他域的數據
l? 應用管理工作可以分散進行
l? 資源可以根據計算的需要合適地分配
一個域可以跨越多臺(個)機器或處理器。所有的客戶端通過BB(Bulletin Board)了解所有的機器上提供的交易。BB間的一致性通過DBBL(DistinguishedBulletin Board Liaison)來保證。
通過/Domain,可以維護獨立于主域的BB,可以設定那些交易可以響應其他機器。當一個遠程域提出一個合法的交易請求時,/Domain將請求發送到被請求域并把返回送到請求進程。
以下介紹進行域間通訊時需修改的配置。
?本節要點
l? 概念解釋
l? 配置過程
——環境變量
——ubbconfig
——dmconfig
——dmloadcf
?
使用TUXEDO組件/DOMAINS時,需要對管理配置作一些改變。在以下例子中,會創建一個獨立的測試應用環境(DOMAINID是TEST),它可以讀取/請求另一個應用的交易(ProdCust)的數據。
服務GWTDOMAIN(GWT)負責響應域間通訊。GWADM和DMADM是處理管理交易和域服務的管理服務。這些服務必須配置在UBBCONFIG文件中。配置信息必須在遠程和本地應用環境中定義。
服務GWTDOMAIN通過TCP/IP協議與其他域進行通訊。物理上遠程的域的應用位置是透明的。
服務GWTDOMAIN是雙向的:可以處理遠程域發來的請求也可以向遠程域發出請求。
除UBBCONFIG外,配置/DOMAINS還需要一些信息。這些信息在DMCONFIG文件中。DMCONFIG的文本文件通過BDMCONFIG編譯成二進制文件。
?過程
第一步:UBBCONFIG應作相應改動
?????? 為/DOMAIN建立的新組應該和其他應用組隔離開。其一用于管理,其他是網關服務。
UBBCONFIG
*RESOURCES
?IPCKEY????????????????? 49152
?MAXACCESSERS????? 2
?MAXSERVERS?????????? 25
?MASTER??????????????? SITE1
?MODEL?????????????????? SHM
*MACHINES
?class2????????????????????? LMID=SITE1
?????????????????????????????????? TUXDIR=”/usr/tuxedo”
????????????????????????????????? APPDIR=”/usr/apps/atmapp”
?????????????????????????????????? TUXCONFIG=”/usr/apps/atmapp/atmapp.tux”
*GROUPS
?LDMGRP??????????????? LMID=SITE1???? GRPNO=20
?LGWGRP?????????????? LMID=SITE1???? GRPNO=30
#下一行用于‘prod’域
?APP1?????????????????????? LMID=SITE1 ?? GRPNO=10
*SERVERS
?DMADM????????????????? SRVGRP=LDMGRP???? SRVID=200
?GWADM???????????????? SRVGRP=LGWGRP???? SRVID=310
?GWTDOMAIN??????? SRVGRP=LGWGRP???? SRVID=320
#下一行用于‘prod’域
?CUSTOMER????????? CLOPT=”-A”????? SRVGRP=APP1???? SRVID=100
*SERVICES
#下一行用于‘prod’域
ProdCust
 
 
第二步:為域間請求創建DMCONFIG
?????? 下文的ASCII數據存在的文件一般稱為DMCONFIG,由此生成的二進制格式文件稱為BDMCONFIG。以下的DMCONFIG存在于“TEST“域,用來請求遠程的”prod“域的”ProdCust“交易。
DMCONFIG on TEST DOMAIN
*DM_LOCAL_DOMAINS
test?????????????? GWGRP=LGWGRP
??????????????????????????? TYPE=TDOMAIN
??????????????????????????? DOMAINID=”TEST”
??????????????????????????? DMTLOGDEV=”/usr/apps/atmapp/logs/DLOG”
*DM_REMOTE_DOMAINS
production???????? TYPE=TDOMAIN
??????????????????????????? DOMAINID=”prod”
*DM_TDOMAIN
prod??????????????????? NWADDR=”//lcspn1:3070”
??????????????????????????? NWDEVICE=”/dev/xti/tcp”
TEST????????????????? NWADDR=”//lcspn2:3070”
??????????????????????????? NWDEVICE=”/dev/xti/tcp”
*DM_REMOTE_SERVICES
?ProdCust
*DM_LOCAL_SERVICES
第三步:創建DMCONFIG指定對域外提供的交易
 
下文的DMCONFIG位于域’prod’,該域將向其他域提供可調用交易:ProdCust。
域‘prod’上的DMCONFIG
#本地域信息
*DM_LOCAL_DOMAINS
??????????????????????????? #LMID
production???????? GWGRP=LGWGRP
??????????????????????????? #域描述:TDOMAIN即TUXEDODOMAINS
??????????????????????????? TYPE=TDOMAIN???
??????????????????????????? #域的唯一標識符
??????????????????????????? DOMAINID=”prod”
??????????????????????????? #交易的日志
??????????????????????????? DMTLOGDEV=”/usr/apps/atmapp/logs/DLOG”
#遠程域信息
*DM_REMOTE_DOMAINS
test?????????????? TYPE=TDOMAIN
??????????????????????????? DOMAINID=”TEST”
*DM_TDOMAIN
??????????????????????????? #地址和設備名
prod??????????????????? NWADDR=”//lcspn1:3070”
??????????????????????????? NWDEVICE=”/dev/xti/tcp”
TEST????????????????? NWADDR=”//lcspn2:3070”
??????????????????????????? NWDEVICE=”/dev/xti/tcp”
*DM_REMOTE_SERVICES
*DM_LOCAL_SERVICES
#遠程域可以使用的交易
?ProdCust
?第四步:設定環境變量
/DOMAIN進程需要額外的環境變量去訪問/DOMAINS配置信息
exportBDMCONFIG=/usr/apps/atmapp/atmapp.bdm
?第五步:編譯ubbconfig
本過程是從兩個域中相同的UBBCONFIG生成二進制文件TUXCONFIG。在本例中,UBBCONFIG的信息位于’ubbconfig’。
tmloadcf –y ubbconfig?
第六步:編譯dmconfig
 
本過程是創建二進制DOMAINS配置文件,BDMCONFIG,在兩個域中相同;而兩者都有的文件‘dmconfig’內容是不同的。
dmloadcf –y dmconfig
總結
以上是生活随笔為你收集整理的bea tuxedo中间件入门的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 聊聊前端八股文?
- 下一篇: 前端学习(3183):ant-desig
