3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bea tuxedo中间件入门

發布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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? 配置成了一件單純的管理工作,進一步的,可以通過配置輕易的改變系統結構。服務可以動態的增加、刪除和重啟動。

?


TUXEDOC/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? 動態修改服務或交易參數

使用GAItmadmin可以動態進行以下調整:

——交易可以掛起、恢復、發布和取消

——交易參數可以修改,如:LOADPRIORITY

——指定交易的超時時間

——交易口令

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();

}


?

結合FMLVIEW

?????? 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。每個遠程或本地機器上的組都提供相同的交易。

?


使用DDRubbconfig的范例

*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時,需要對管理配置作一些改變。在以下例子中,會創建一個獨立的測試應用環境(DOMAINIDTEST),它可以讀取/請求另一個應用的交易(ProdCust)的數據。

服務GWTDOMAIN(GWT)負責響應域間通訊。GWADMDMADM是處理管理交易和域服務的管理服務。這些服務必須配置在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中间件入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

又湿又紧又大又爽a视频国产 | 人妻天天爽夜夜爽一区二区 | 精品乱码久久久久久久 | 亚洲一区二区观看播放 | 国产成人无码区免费内射一片色欲 | 99国产精品白浆在线观看免费 | 久久久久久a亚洲欧洲av冫 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕乱码亚洲无线三区 | 秋霞特色aa大片 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲国产欧美在线成人 | 亚洲综合伊人久久大杳蕉 | 性欧美大战久久久久久久 | 国产av人人夜夜澡人人爽麻豆 | 天天拍夜夜添久久精品 | 久久熟妇人妻午夜寂寞影院 | 国产精品视频免费播放 | 亚洲精品国产a久久久久久 | 中文字幕无线码免费人妻 | 夜夜躁日日躁狠狠久久av | 丁香啪啪综合成人亚洲 | 亚洲人成影院在线无码按摩店 | 亚洲精品一区二区三区婷婷月 | 日韩在线不卡免费视频一区 | 日本精品少妇一区二区三区 | 久久午夜无码鲁丝片 | 女人被男人爽到呻吟的视频 | 亚洲午夜无码久久 | 国产真人无遮挡作爱免费视频 | 青青久在线视频免费观看 | 97精品人妻一区二区三区香蕉 | 精品久久8x国产免费观看 | 领导边摸边吃奶边做爽在线观看 | 小sao货水好多真紧h无码视频 | 日韩人妻无码一区二区三区久久99 | 老司机亚洲精品影院 | 人人澡人摸人人添 | 国产特级毛片aaaaaa高潮流水 | 亚洲精品综合五月久久小说 | 国产亚洲人成a在线v网站 | 熟女少妇人妻中文字幕 | 亚洲国产av精品一区二区蜜芽 | 牛和人交xxxx欧美 | 日日麻批免费40分钟无码 | 国产偷抇久久精品a片69 | 欧洲精品码一区二区三区免费看 | 日韩精品成人一区二区三区 | 理论片87福利理论电影 | 天天燥日日燥 | 亚洲精品一区二区三区在线观看 | 欧美成人午夜精品久久久 | 男人的天堂2018无码 | 久久视频在线观看精品 | 香港三级日本三级妇三级 | а√资源新版在线天堂 | 我要看www免费看插插视频 | 亚洲成av人片在线观看无码不卡 | 日本精品人妻无码免费大全 | 少女韩国电视剧在线观看完整 | 国产黄在线观看免费观看不卡 | 大色综合色综合网站 | av香港经典三级级 在线 | 少妇一晚三次一区二区三区 | 久久久久国色av免费观看性色 | 中文久久乱码一区二区 | 国产亚洲视频中文字幕97精品 | 鲁一鲁av2019在线 | 国产精品美女久久久网av | 久久精品一区二区三区四区 | 亚洲综合色区中文字幕 | 漂亮人妻洗澡被公强 日日躁 | 亚洲精品一区二区三区婷婷月 | 99久久精品国产一区二区蜜芽 | 亚洲精品一区三区三区在线观看 | 成人无码视频在线观看网站 | 国产精品久久久一区二区三区 | 人妻天天爽夜夜爽一区二区 | av无码电影一区二区三区 | 人妻尝试又大又粗久久 | 初尝人妻少妇中文字幕 | 欧美兽交xxxx×视频 | 天堂无码人妻精品一区二区三区 | 欧美真人作爱免费视频 | av无码久久久久不卡免费网站 | 撕开奶罩揉吮奶头视频 | 中文字幕av伊人av无码av | 夜精品a片一区二区三区无码白浆 | 亚洲一区二区三区在线观看网站 | 免费中文字幕日韩欧美 | 领导边摸边吃奶边做爽在线观看 | 国产婷婷色一区二区三区在线 | 成在人线av无码免费 | 少妇被粗大的猛进出69影院 | 久久久久成人片免费观看蜜芽 | 国产精品无码一区二区桃花视频 | 日韩精品成人一区二区三区 | 国产精品自产拍在线观看 | 国产香蕉97碰碰久久人人 | 少妇无码一区二区二三区 | 中文字幕无码av激情不卡 | 久久精品国产一区二区三区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 人妻与老人中文字幕 | 西西人体www44rt大胆高清 | 欧美 丝袜 自拍 制服 另类 | 国产9 9在线 | 中文 | 最近免费中文字幕中文高清百度 | 国产激情无码一区二区 | 狂野欧美性猛交免费视频 | 在线播放亚洲第一字幕 | 中文字幕无码日韩专区 | 亚洲欧美精品aaaaaa片 | 天下第一社区视频www日本 | 日产精品99久久久久久 | 99精品视频在线观看免费 | 国产亲子乱弄免费视频 | 九九在线中文字幕无码 | 国产精品鲁鲁鲁 | 日日摸夜夜摸狠狠摸婷婷 | 玩弄少妇高潮ⅹxxxyw | 日本va欧美va欧美va精品 | 久久久久久久久蜜桃 | 天天综合网天天综合色 | 麻豆国产丝袜白领秘书在线观看 | 国产亚洲精品精品国产亚洲综合 | 久久久久久国产精品无码下载 | 国产激情艳情在线看视频 | 久久精品人人做人人综合试看 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲第一无码av无码专区 | 久久久久se色偷偷亚洲精品av | 成人精品一区二区三区中文字幕 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲熟妇色xxxxx欧美老妇 | 国产无套粉嫩白浆在线 | 久久精品人妻少妇一区二区三区 | 久久久久亚洲精品男人的天堂 | 欧美性黑人极品hd | 色偷偷人人澡人人爽人人模 | 国产精品18久久久久久麻辣 | 狠狠噜狠狠狠狠丁香五月 | 亚洲国产综合无码一区 | 免费国产成人高清在线观看网站 | 国产免费久久久久久无码 | 亚洲成av人在线观看网址 | 无码国产色欲xxxxx视频 | 搡女人真爽免费视频大全 | 亚洲成色www久久网站 | 国内精品久久毛片一区二区 | 成人精品天堂一区二区三区 | 久久国产精品精品国产色婷婷 | 无码午夜成人1000部免费视频 | 人人妻人人澡人人爽欧美一区九九 | 人人妻人人澡人人爽欧美精品 | 久久99精品久久久久久 | 婷婷综合久久中文字幕蜜桃三电影 | 日本乱偷人妻中文字幕 | 蜜臀av在线播放 久久综合激激的五月天 | 色窝窝无码一区二区三区色欲 | 狂野欧美激情性xxxx | 亚洲乱码中文字幕在线 | 在线成人www免费观看视频 | 免费国产成人高清在线观看网站 | 牲欲强的熟妇农村老妇女视频 | 免费观看又污又黄的网站 | 亚洲狠狠婷婷综合久久 | 超碰97人人做人人爱少妇 | 精品日本一区二区三区在线观看 | 日日天干夜夜狠狠爱 | 亚无码乱人伦一区二区 | 国产精品国产自线拍免费软件 | 一本色道久久综合亚洲精品不卡 | 无码播放一区二区三区 | 色综合久久中文娱乐网 | 扒开双腿疯狂进出爽爽爽视频 | 色婷婷综合激情综在线播放 | 色欲综合久久中文字幕网 | 亚洲中文字幕无码一久久区 | 久久无码专区国产精品s | 男女超爽视频免费播放 | 中文字幕无码免费久久9一区9 | 欧美老熟妇乱xxxxx | 国模大胆一区二区三区 | 日本又色又爽又黄的a片18禁 | 久精品国产欧美亚洲色aⅴ大片 | 欧美亚洲国产一区二区三区 | 日韩视频 中文字幕 视频一区 | 精品欧美一区二区三区久久久 | 精品无码国产自产拍在线观看蜜 | 日本爽爽爽爽爽爽在线观看免 | 国产办公室秘书无码精品99 | yw尤物av无码国产在线观看 | 天天躁夜夜躁狠狠是什么心态 | 2020久久超碰国产精品最新 | 无码纯肉视频在线观看 | 国产精品久久久久久久9999 | 天天拍夜夜添久久精品 | 无码人中文字幕 | 狠狠色色综合网站 | 午夜福利电影 | 午夜性刺激在线视频免费 | 蜜臀av无码人妻精品 | 国产后入清纯学生妹 | 精品无码国产自产拍在线观看蜜 | www成人国产高清内射 | 高清无码午夜福利视频 | 一本久久a久久精品亚洲 | 亚洲色www成人永久网址 | 国产一区二区三区四区五区加勒比 | 亚洲伊人久久精品影院 | 性色欲情网站iwww九文堂 | 一本久道久久综合狠狠爱 | 丰满肥臀大屁股熟妇激情视频 | 妺妺窝人体色www在线小说 | 精品无码国产一区二区三区av | 亚洲人交乣女bbw | 人人妻人人澡人人爽欧美一区九九 | a在线观看免费网站大全 | 真人与拘做受免费视频一 | 久久精品国产99久久6动漫 | 国产特级毛片aaaaaaa高清 | 国产小呦泬泬99精品 | 无套内谢老熟女 | yw尤物av无码国产在线观看 | 亚洲男女内射在线播放 | 夜夜影院未满十八勿进 | 两性色午夜免费视频 | 国产真实乱对白精彩久久 | 国产黄在线观看免费观看不卡 | 国产极品美女高潮无套在线观看 | 国产高清av在线播放 | 国产精品美女久久久久av爽李琼 | 欧美日韩人成综合在线播放 | 精品乱子伦一区二区三区 | 无码人妻久久一区二区三区不卡 | 国产成人午夜福利在线播放 | 免费乱码人妻系列无码专区 | 成人aaa片一区国产精品 | 水蜜桃av无码 | 日本大香伊一区二区三区 | 亚洲乱码国产乱码精品精 | 女人被男人躁得好爽免费视频 | 久久国语露脸国产精品电影 | 东京无码熟妇人妻av在线网址 | 亚洲s码欧洲m码国产av | 国产熟妇高潮叫床视频播放 | 日产精品高潮呻吟av久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 狠狠噜狠狠狠狠丁香五月 | 牛和人交xxxx欧美 | 国产三级久久久精品麻豆三级 | 亚洲一区二区观看播放 | 成人一区二区免费视频 | 少妇性l交大片 | 国内精品人妻无码久久久影院蜜桃 | 国产99久久精品一区二区 | 亚洲精品国产第一综合99久久 | 亚洲一区av无码专区在线观看 | 亚洲性无码av中文字幕 | 日产国产精品亚洲系列 | 国产精品无码成人午夜电影 | 亚洲成a人片在线观看日本 | 无码中文字幕色专区 | 色综合久久久久综合一本到桃花网 | 精品欧美一区二区三区久久久 | 色五月五月丁香亚洲综合网 | 波多野结衣一区二区三区av免费 | 日韩精品无码一区二区中文字幕 | 亚洲精品综合五月久久小说 | 老头边吃奶边弄进去呻吟 | 日韩精品a片一区二区三区妖精 | 亚洲春色在线视频 | 伊在人天堂亚洲香蕉精品区 | 天堂在线观看www | 亚洲综合无码一区二区三区 | 无码av岛国片在线播放 | 欧美freesex黑人又粗又大 | 中文字幕乱码亚洲无线三区 | 高潮毛片无遮挡高清免费 | 国产xxx69麻豆国语对白 | 亚洲精品国产a久久久久久 | √8天堂资源地址中文在线 | 色五月五月丁香亚洲综合网 | 欧洲欧美人成视频在线 | 免费播放一区二区三区 | 国产精品二区一区二区aⅴ污介绍 | 国内少妇偷人精品视频 | 精品国产一区二区三区av 性色 | 人人妻人人澡人人爽欧美一区九九 | 久久精品国产99久久6动漫 | 无码人妻精品一区二区三区不卡 | 色偷偷人人澡人人爽人人模 | 夜夜影院未满十八勿进 | 天堂无码人妻精品一区二区三区 | 亚洲人交乣女bbw | 日本大乳高潮视频在线观看 | 国产va免费精品观看 | 亚洲国产精品一区二区第一页 | 丰满少妇女裸体bbw | 乱人伦人妻中文字幕无码久久网 | 日韩人妻无码一区二区三区久久99 | 久久国产36精品色熟妇 | 国产区女主播在线观看 | 欧美 丝袜 自拍 制服 另类 | 97久久国产亚洲精品超碰热 | 国产激情精品一区二区三区 | 成人一区二区免费视频 | 亚洲人成网站在线播放942 | 国产成人一区二区三区别 | 六月丁香婷婷色狠狠久久 | 中文字幕无码av波多野吉衣 | 欧美色就是色 | 国产成人久久精品流白浆 | 亚洲综合久久一区二区 | 粉嫩少妇内射浓精videos | 中文字幕乱码人妻无码久久 | 成人影院yy111111在线观看 | 欧美野外疯狂做受xxxx高潮 | 性欧美videos高清精品 | 亚洲成av人在线观看网址 | 丝袜 中出 制服 人妻 美腿 | 2019nv天堂香蕉在线观看 | 大地资源中文第3页 | 久久午夜夜伦鲁鲁片无码免费 | 国产 精品 自在自线 | 99精品国产综合久久久久五月天 | 天堂久久天堂av色综合 | 131美女爱做视频 | 亚洲国产精品无码久久久久高潮 | 亚洲精品一区二区三区在线观看 | 99视频精品全部免费免费观看 | 成人无码精品一区二区三区 | 波多野结衣av一区二区全免费观看 | 2019nv天堂香蕉在线观看 | 欧美国产亚洲日韩在线二区 | 日日天干夜夜狠狠爱 | 妺妺窝人体色www婷婷 | 国产成人无码av一区二区 | 99久久人妻精品免费一区 | 亚洲午夜福利在线观看 | 精品欧洲av无码一区二区三区 | 亚洲精品国产精品乱码视色 | 日本在线高清不卡免费播放 | 人人妻人人澡人人爽欧美一区 | 亚洲欧美综合区丁香五月小说 | 久久亚洲中文字幕无码 | 老熟妇仑乱视频一区二区 | 色综合久久久无码网中文 | 久久久久se色偷偷亚洲精品av | 亚洲乱码国产乱码精品精 | 麻豆md0077饥渴少妇 | 国产艳妇av在线观看果冻传媒 | 装睡被陌生人摸出水好爽 | 国产精品久久久一区二区三区 | 国产乱人伦av在线无码 | 国产精品无码mv在线观看 | 波多野结衣aⅴ在线 | 无码人妻久久一区二区三区不卡 | 亚洲国产成人av在线观看 | 亚洲一区二区三区国产精华液 | 一本精品99久久精品77 | 国模大胆一区二区三区 | 久久国产精品二国产精品 | 国产一区二区三区日韩精品 | 国产精品.xx视频.xxtv | 精品无码av一区二区三区 | 疯狂三人交性欧美 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 成 人影片 免费观看 | 无码纯肉视频在线观看 | 成年女人永久免费看片 | 天天拍夜夜添久久精品 | 内射后入在线观看一区 | 精品欧美一区二区三区久久久 | 天堂亚洲2017在线观看 | 亚洲色欲色欲欲www在线 | 国产精品永久免费视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲熟妇自偷自拍另类 | 亚洲无人区午夜福利码高清完整版 | 最新国产麻豆aⅴ精品无码 | 天堂а√在线中文在线 | 蜜桃视频插满18在线观看 | 久久婷婷五月综合色国产香蕉 | 国产人妻人伦精品1国产丝袜 | 国产又爽又猛又粗的视频a片 | 欧美乱妇无乱码大黄a片 | 日韩精品无码免费一区二区三区 | 久久人人爽人人人人片 | 亚洲精品无码人妻无码 | 4hu四虎永久在线观看 | 午夜无码人妻av大片色欲 | 亚洲精品www久久久 | 久久国产精品偷任你爽任你 | 天堂一区人妻无码 | 疯狂三人交性欧美 | 国内精品久久毛片一区二区 | 中国大陆精品视频xxxx | 欧美高清在线精品一区 | 99re在线播放 | 成人精品一区二区三区中文字幕 | 亚洲成a人片在线观看无码3d | 又大又紧又粉嫩18p少妇 | 一区二区三区乱码在线 | 欧洲 | 纯爱无遮挡h肉动漫在线播放 | 51国偷自产一区二区三区 | 国精产品一品二品国精品69xx | 午夜理论片yy44880影院 | 色情久久久av熟女人妻网站 | 日日天干夜夜狠狠爱 | 老熟女重囗味hdxx69 | 99久久久国产精品无码免费 | 午夜福利一区二区三区在线观看 | 动漫av一区二区在线观看 | 日本丰满护士爆乳xxxx | 国产精品丝袜黑色高跟鞋 | 欧美亚洲国产一区二区三区 | 国产精品成人av在线观看 | 国产亚av手机在线观看 | 色 综合 欧美 亚洲 国产 | 国产色视频一区二区三区 | 老子影院午夜精品无码 | 99久久精品国产一区二区蜜芽 | 无码人妻黑人中文字幕 | 欧美日本日韩 | 国产精品国产自线拍免费软件 | 97精品人妻一区二区三区香蕉 | 少妇一晚三次一区二区三区 | 99久久久无码国产精品免费 | 欧洲欧美人成视频在线 | 粗大的内捧猛烈进出视频 | 中文无码精品a∨在线观看不卡 | 国产片av国语在线观看 | 国产午夜亚洲精品不卡下载 | 永久免费精品精品永久-夜色 | 国产激情精品一区二区三区 | 日韩av激情在线观看 | 正在播放老肥熟妇露脸 | 18精品久久久无码午夜福利 | 国产精品内射视频免费 | 国产香蕉尹人视频在线 | 1000部啪啪未满十八勿入下载 | 国产97色在线 | 免 | 国产精华av午夜在线观看 | 中文字幕乱码人妻二区三区 | 爱做久久久久久 | 性欧美熟妇videofreesex | 欧美日本免费一区二区三区 | 国产三级久久久精品麻豆三级 | 国产一区二区三区影院 | 亚洲精品成人av在线 | 夜夜躁日日躁狠狠久久av | 欧美兽交xxxx×视频 | 色妞www精品免费视频 | 亚洲日韩一区二区三区 | 国产精品亚洲五月天高清 | 亚洲精品久久久久久久久久久 | 国产内射爽爽大片视频社区在线 | 午夜性刺激在线视频免费 | 中文无码精品a∨在线观看不卡 | 国产精品久久久久无码av色戒 | 日本精品少妇一区二区三区 | 在线视频网站www色 | 欧美亚洲国产一区二区三区 | 亚洲日韩av片在线观看 | 亚洲区欧美区综合区自拍区 | 精品国产成人一区二区三区 | 男女爱爱好爽视频免费看 | 漂亮人妻洗澡被公强 日日躁 | 亚洲伊人久久精品影院 | 欧美zoozzooz性欧美 | 在线观看免费人成视频 | 波多野42部无码喷潮在线 | www国产精品内射老师 | 成人免费无码大片a毛片 | 婷婷六月久久综合丁香 | 精品国产aⅴ无码一区二区 | 久久精品国产精品国产精品污 | www国产亚洲精品久久久日本 | 国语自产偷拍精品视频偷 | 久久精品人人做人人综合 | 久久久精品国产sm最大网站 | 亚洲精品国偷拍自产在线观看蜜桃 | 老熟女重囗味hdxx69 | 天堂а√在线中文在线 | 国产一区二区三区精品视频 | 国产一区二区三区精品视频 | 成人欧美一区二区三区黑人免费 | 狠狠综合久久久久综合网 | 国产美女极度色诱视频www | 国产午夜亚洲精品不卡下载 | 日本精品久久久久中文字幕 | yw尤物av无码国产在线观看 | 在线 国产 欧美 亚洲 天堂 | 一本色道久久综合狠狠躁 | 精品久久久无码人妻字幂 | 最新版天堂资源中文官网 | 男人扒开女人内裤强吻桶进去 | 日本大乳高潮视频在线观看 | 国产超碰人人爽人人做人人添 | 成人无码精品一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 久久这里只有精品视频9 | 久久久精品欧美一区二区免费 | 日产国产精品亚洲系列 | 老子影院午夜伦不卡 | 成人亚洲精品久久久久软件 | 国产女主播喷水视频在线观看 | 亚洲日本一区二区三区在线 | 国产精品沙发午睡系列 | 久久国产精品二国产精品 | 日本xxxx色视频在线观看免费 | 国产热a欧美热a在线视频 | 久久久久久九九精品久 | 国产卡一卡二卡三 | 在线观看国产午夜福利片 | 久久久中文字幕日本无吗 | 国产精品二区一区二区aⅴ污介绍 | 水蜜桃av无码 | 久久无码专区国产精品s | 妺妺窝人体色www婷婷 | 亚洲一区av无码专区在线观看 | 欧美 丝袜 自拍 制服 另类 | 亚洲精品久久久久久久久久久 | 欧美性生交xxxxx久久久 | 亚洲精品一区二区三区四区五区 | 国产情侣作爱视频免费观看 | 99精品无人区乱码1区2区3区 | 欧美性猛交内射兽交老熟妇 | 老熟女重囗味hdxx69 | 精品一区二区三区波多野结衣 | 女人被爽到呻吟gif动态图视看 | 一区二区传媒有限公司 | www一区二区www免费 | 婷婷综合久久中文字幕蜜桃三电影 | 六月丁香婷婷色狠狠久久 | 小sao货水好多真紧h无码视频 | 欧美成人免费全部网站 | 中文字幕日韩精品一区二区三区 | 亚洲精品综合五月久久小说 | 欧美高清在线精品一区 | 亚洲国产欧美在线成人 | 国产午夜视频在线观看 | 精品无码av一区二区三区 | 日本一区二区三区免费播放 | 国产香蕉尹人视频在线 | 久久国产劲爆∧v内射 | 欧美乱妇无乱码大黄a片 | 国内丰满熟女出轨videos | 精品国产一区二区三区四区 | 丁香啪啪综合成人亚洲 | 午夜精品久久久久久久 | 国产人妻精品午夜福利免费 | 亚洲国产精品毛片av不卡在线 | 亚洲精品国偷拍自产在线麻豆 | 熟妇女人妻丰满少妇中文字幕 | 又大又黄又粗又爽的免费视频 | 精品国产一区二区三区四区 | 亚洲欧美国产精品专区久久 | 亚洲一区二区三区在线观看网站 | 久久人人爽人人人人片 | 国产亚洲精品久久久久久久久动漫 | 无码一区二区三区在线观看 | 国产亚洲视频中文字幕97精品 | 亚洲va中文字幕无码久久不卡 | 色婷婷久久一区二区三区麻豆 | 日本护士毛茸茸高潮 | 欧美老妇与禽交 | 未满小14洗澡无码视频网站 | 丰满人妻被黑人猛烈进入 | 成人一区二区免费视频 | 国产成人无码午夜视频在线观看 | 欧美人与物videos另类 | 中文字幕精品av一区二区五区 | 午夜福利试看120秒体验区 | 国产黄在线观看免费观看不卡 | 色一情一乱一伦一视频免费看 | 国产午夜福利亚洲第一 | 国内揄拍国内精品少妇国语 | 亚洲 激情 小说 另类 欧美 | 色综合久久久无码中文字幕 | 宝宝好涨水快流出来免费视频 | 玩弄人妻少妇500系列视频 | 日日橹狠狠爱欧美视频 | 国产艳妇av在线观看果冻传媒 | 99精品无人区乱码1区2区3区 | 男人和女人高潮免费网站 | 人妻少妇精品久久 | 国产精品美女久久久网av | av无码久久久久不卡免费网站 | 亚洲 高清 成人 动漫 | 2019午夜福利不卡片在线 | 欧美人与牲动交xxxx | 国産精品久久久久久久 | 98国产精品综合一区二区三区 | 国内精品人妻无码久久久影院 | 日韩av无码一区二区三区不卡 | 成人综合网亚洲伊人 | 欧美国产日韩久久mv | 丰满肥臀大屁股熟妇激情视频 | 99er热精品视频 | 欧美国产日韩亚洲中文 | 天堂在线观看www | 午夜无码人妻av大片色欲 | 亚洲成在人网站无码天堂 | 夜夜高潮次次欢爽av女 | 亚洲精品综合一区二区三区在线 | 亚洲精品国产a久久久久久 | 精品水蜜桃久久久久久久 | 日本大香伊一区二区三区 | 无码人妻丰满熟妇区毛片18 | 国产在线aaa片一区二区99 | 丁香啪啪综合成人亚洲 | 久久久久成人精品免费播放动漫 | 大肉大捧一进一出视频出来呀 | 中文字幕 亚洲精品 第1页 | 国内综合精品午夜久久资源 | 婷婷丁香五月天综合东京热 | 精品一区二区不卡无码av | 国产精品国产三级国产专播 | 亚洲中文无码av永久不收费 | 欧美熟妇另类久久久久久多毛 | 午夜精品一区二区三区的区别 | 国产精品美女久久久久av爽李琼 | 东京热无码av男人的天堂 | 久久精品一区二区三区四区 | 久久伊人色av天堂九九小黄鸭 | 国产成人无码午夜视频在线观看 | 性色欲网站人妻丰满中文久久不卡 | 97久久超碰中文字幕 | 麻豆成人精品国产免费 | 亚洲中文字幕久久无码 | 扒开双腿疯狂进出爽爽爽视频 | 内射巨臀欧美在线视频 | 爽爽影院免费观看 | 伊人色综合久久天天小片 | 成人亚洲精品久久久久 | 国产精品人人爽人人做我的可爱 | 日本一卡2卡3卡四卡精品网站 | 亚洲一区二区三区偷拍女厕 | 亚洲中文字幕在线无码一区二区 | 亚洲成熟女人毛毛耸耸多 | 日本大香伊一区二区三区 | 久久久精品456亚洲影院 | 无码人妻精品一区二区三区下载 | 色综合久久88色综合天天 | 7777奇米四色成人眼影 | 国产精品久久久久无码av色戒 | 在线观看国产一区二区三区 | 丰腴饱满的极品熟妇 | 任你躁在线精品免费 | 国产人妻久久精品二区三区老狼 | 在线亚洲高清揄拍自拍一品区 | 亚洲熟熟妇xxxx | 亚洲中文字幕在线无码一区二区 | 国产精品亚洲五月天高清 | 少女韩国电视剧在线观看完整 | 国内精品久久毛片一区二区 | 欧美激情内射喷水高潮 | 国产精品嫩草久久久久 | 黑人玩弄人妻中文在线 | 九九综合va免费看 | 久久精品人妻少妇一区二区三区 | 欧洲熟妇精品视频 | 理论片87福利理论电影 | 久热国产vs视频在线观看 | 日产国产精品亚洲系列 | 国产精品嫩草久久久久 | 对白脏话肉麻粗话av | 免费网站看v片在线18禁无码 | 久久久久亚洲精品中文字幕 | 人妻体内射精一区二区三四 | 亚洲男人av天堂午夜在 | 人人妻在人人 | 国产色xx群视频射精 | 色综合久久久无码网中文 | 日本熟妇乱子伦xxxx | 国产精品久久久久无码av色戒 | 国产精品久久久一区二区三区 | 国产真实夫妇视频 | 亚洲精品综合一区二区三区在线 | 狠狠色丁香久久婷婷综合五月 | 人妻天天爽夜夜爽一区二区 | 国产电影无码午夜在线播放 | 强伦人妻一区二区三区视频18 | 亚洲欧美综合区丁香五月小说 | 成人女人看片免费视频放人 | 天天摸天天碰天天添 | 麻豆av传媒蜜桃天美传媒 | 人人妻人人澡人人爽欧美精品 | 55夜色66夜色国产精品视频 | 少妇一晚三次一区二区三区 | 久久久无码中文字幕久... | 伊人久久大香线蕉亚洲 | 中文字幕乱码中文乱码51精品 | 人人妻人人藻人人爽欧美一区 | 熟女体下毛毛黑森林 | 一本久久a久久精品亚洲 | 国产精品久久久久久亚洲毛片 | 2020久久超碰国产精品最新 | 久久天天躁夜夜躁狠狠 | 亚洲精品午夜国产va久久成人 | 成人片黄网站色大片免费观看 | 无码精品人妻一区二区三区av | 久久精品人妻少妇一区二区三区 | 国产色xx群视频射精 | 国产香蕉尹人视频在线 | 久久久久成人片免费观看蜜芽 | 亚洲a无码综合a国产av中文 | 精品 日韩 国产 欧美 视频 | 漂亮人妻洗澡被公强 日日躁 | 亚洲熟妇色xxxxx亚洲 | 成人性做爰aaa片免费看 | 亚洲 a v无 码免 费 成 人 a v | 亚洲一区二区三区在线观看网站 | 性欧美videos高清精品 | 露脸叫床粗话东北少妇 | 国产女主播喷水视频在线观看 | 97夜夜澡人人双人人人喊 | 欧洲熟妇精品视频 | 亚洲精品欧美二区三区中文字幕 | 欧美 丝袜 自拍 制服 另类 | 久久亚洲精品中文字幕无男同 | 精品无码国产一区二区三区av | 一区二区三区乱码在线 | 欧洲 | 久久综合色之久久综合 | 日本欧美一区二区三区乱码 | 成在人线av无码免观看麻豆 | 国产成人一区二区三区在线观看 | 丰满少妇弄高潮了www | 色欲av亚洲一区无码少妇 | 精品夜夜澡人妻无码av蜜桃 | 久久人妻内射无码一区三区 | 成人免费视频视频在线观看 免费 | 国产成人久久精品流白浆 | 粉嫩少妇内射浓精videos | 日本在线高清不卡免费播放 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲中文无码av永久不收费 | 国产内射老熟女aaaa | 巨爆乳无码视频在线观看 | 任你躁在线精品免费 | 亚洲国产日韩a在线播放 | 俺去俺来也在线www色官网 | 精品人妻中文字幕有码在线 | 久久国产36精品色熟妇 | 精品国偷自产在线视频 | 成人无码视频在线观看网站 | 国产网红无码精品视频 | 波多野结衣av在线观看 | 18禁止看的免费污网站 | 亚洲一区av无码专区在线观看 | 国产在线精品一区二区三区直播 | 鲁大师影院在线观看 | 久久久久99精品国产片 | 无码国产色欲xxxxx视频 | 无码国模国产在线观看 | 国产人妻精品一区二区三区不卡 | 国产精品鲁鲁鲁 | 又湿又紧又大又爽a视频国产 | 亚洲一区二区三区四区 | 亚洲男人av天堂午夜在 | 国产亚洲视频中文字幕97精品 | 无码国内精品人妻少妇 | 4hu四虎永久在线观看 | 国产精品高潮呻吟av久久 | 久久国产劲爆∧v内射 | 成 人影片 免费观看 | 国产乱人无码伦av在线a | 亲嘴扒胸摸屁股激烈网站 | 欧洲欧美人成视频在线 | 国产激情无码一区二区app | 老熟女重囗味hdxx69 | 久久国语露脸国产精品电影 | 免费无码av一区二区 | 日本乱人伦片中文三区 | 18精品久久久无码午夜福利 | 日本欧美一区二区三区乱码 | 国产色视频一区二区三区 | 欧美日韩综合一区二区三区 | 亚洲成色www久久网站 | 97久久超碰中文字幕 | 成人一区二区免费视频 | 亚洲精品一区三区三区在线观看 | 亚洲一区二区三区香蕉 | 欧美性黑人极品hd | 亚洲精品一区国产 | 野狼第一精品社区 | 日本www一道久久久免费榴莲 | 久久国产劲爆∧v内射 | 国产av剧情md精品麻豆 | 日本熟妇浓毛 | 国产小呦泬泬99精品 | 国产免费久久精品国产传媒 | 内射白嫩少妇超碰 | 一本久久a久久精品亚洲 | 成在人线av无码免费 | 亚洲精品综合一区二区三区在线 | 精品亚洲成av人在线观看 | 亚洲成a人片在线观看日本 | 天天av天天av天天透 | 国内精品一区二区三区不卡 | 久久午夜夜伦鲁鲁片无码免费 | 国产亚洲精品精品国产亚洲综合 | 国产人妻久久精品二区三区老狼 | 国产av一区二区三区最新精品 | 国产免费无码一区二区视频 | 精品乱码久久久久久久 | 天堂久久天堂av色综合 | 亚洲色欲色欲天天天www | 大地资源网第二页免费观看 | 欧美日韩一区二区免费视频 | 女人被男人躁得好爽免费视频 | 国产成人精品必看 | 欧美一区二区三区视频在线观看 | 黑人玩弄人妻中文在线 | 亚洲一区二区三区含羞草 | 少妇一晚三次一区二区三区 | 日本熟妇乱子伦xxxx | 中文字幕乱妇无码av在线 | 熟妇人妻中文av无码 | 九九在线中文字幕无码 | 300部国产真实乱 | 亚洲va欧美va天堂v国产综合 | 免费中文字幕日韩欧美 | 国产成人精品视频ⅴa片软件竹菊 | 日韩av无码一区二区三区不卡 | 午夜免费福利小电影 | 亚洲国产av精品一区二区蜜芽 | 精品国产一区二区三区四区 | 兔费看少妇性l交大片免费 | 亚洲爆乳大丰满无码专区 | 麻豆国产丝袜白领秘书在线观看 | 久久久久亚洲精品男人的天堂 | 亚洲日本va午夜在线电影 | 亚洲国产精品久久久天堂 | 奇米影视7777久久精品人人爽 | 欧美老人巨大xxxx做受 | 欧美丰满熟妇xxxx | 久久久久久九九精品久 | 精品一二三区久久aaa片 | 99精品国产综合久久久久五月天 | 精品国产精品久久一区免费式 | 免费乱码人妻系列无码专区 | 日本va欧美va欧美va精品 | 亚洲综合久久一区二区 | 在线播放免费人成毛片乱码 | 亚洲 a v无 码免 费 成 人 a v | 亚洲精品国偷拍自产在线麻豆 | 久久亚洲国产成人精品性色 | 99久久婷婷国产综合精品青草免费 | 久久精品女人天堂av免费观看 | 欧美日韩人成综合在线播放 | 天天摸天天透天天添 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 欧美自拍另类欧美综合图片区 | 欧美第一黄网免费网站 | 乌克兰少妇性做爰 | 欧美精品无码一区二区三区 | 国产区女主播在线观看 | 女人被男人爽到呻吟的视频 | 成人精品天堂一区二区三区 | 色婷婷香蕉在线一区二区 | 国产精品欧美成人 | 国产亚洲人成a在线v网站 | 国产精品对白交换视频 | 日本一本二本三区免费 | 国产莉萝无码av在线播放 | 亚洲国产成人av在线观看 | 久久久www成人免费毛片 | 领导边摸边吃奶边做爽在线观看 | 四虎永久在线精品免费网址 | 中文无码成人免费视频在线观看 | 天天摸天天透天天添 | 性欧美疯狂xxxxbbbb | 丰满人妻精品国产99aⅴ | 粉嫩少妇内射浓精videos | 国产精品久久福利网站 | 久久精品女人天堂av免费观看 | 亚洲成a人片在线观看日本 | 狠狠综合久久久久综合网 | 成人无码视频在线观看网站 | 亚洲色www成人永久网址 | 国产肉丝袜在线观看 | 乱人伦中文视频在线观看 | 国产9 9在线 | 中文 | 国产精品久久久久久久影院 | 日本熟妇乱子伦xxxx | 最近中文2019字幕第二页 | 强开小婷嫩苞又嫩又紧视频 | 成人综合网亚洲伊人 | 一二三四在线观看免费视频 | 免费无码的av片在线观看 | 亚洲欧美日韩国产精品一区二区 | 亚洲毛片av日韩av无码 | 日本欧美一区二区三区乱码 | 搡女人真爽免费视频大全 | 国产熟妇高潮叫床视频播放 | 国内少妇偷人精品视频 | 一本久久伊人热热精品中文字幕 | 欧洲精品码一区二区三区免费看 | 岛国片人妻三上悠亚 | 欧美日韩色另类综合 | 国产人妻久久精品二区三区老狼 | √天堂资源地址中文在线 | 99久久精品午夜一区二区 | 国产高潮视频在线观看 | 国产成人精品无码播放 | 亚洲爆乳精品无码一区二区三区 | 亚洲一区二区三区 | 亚洲国产综合无码一区 | aⅴ亚洲 日韩 色 图网站 播放 | 荡女精品导航 | 久久久精品欧美一区二区免费 | 亚洲熟悉妇女xxx妇女av | 成人综合网亚洲伊人 | 奇米影视7777久久精品人人爽 | 无码精品人妻一区二区三区av | 亚洲精品一区二区三区四区五区 | 久久久久国色av免费观看性色 | 中文字幕+乱码+中文字幕一区 | 成人一在线视频日韩国产 | 久久99热只有频精品8 | 国产在线精品一区二区高清不卡 | 国产精品高潮呻吟av久久4虎 | 伊在人天堂亚洲香蕉精品区 | 午夜性刺激在线视频免费 | 青青草原综合久久大伊人精品 | 国产精品.xx视频.xxtv | 久久综合狠狠综合久久综合88 | 精品国产麻豆免费人成网站 | 天堂а√在线中文在线 | 人妻体内射精一区二区三四 | 亚洲人亚洲人成电影网站色 | 国产精品高潮呻吟av久久 | 四虎国产精品一区二区 | 人人妻人人澡人人爽人人精品 | 国产人成高清在线视频99最全资源 | 国产成人一区二区三区在线观看 | 国产乱子伦视频在线播放 | 亚洲国产欧美日韩精品一区二区三区 | 欧美激情内射喷水高潮 | 在线精品国产一区二区三区 | 久久 国产 尿 小便 嘘嘘 | 成人无码影片精品久久久 | 亚洲熟妇自偷自拍另类 | 麻豆精品国产精华精华液好用吗 | 性色欲网站人妻丰满中文久久不卡 | 国产人妻精品一区二区三区不卡 | 永久免费精品精品永久-夜色 | 国产欧美熟妇另类久久久 | 亚洲一区二区三区 | 亚洲の无码国产の无码步美 | 欧洲vodafone精品性 | 俺去俺来也www色官网 | 国产成人精品视频ⅴa片软件竹菊 | 久久婷婷五月综合色国产香蕉 | 内射爽无广熟女亚洲 | 少妇厨房愉情理9仑片视频 | 亚洲自偷精品视频自拍 | 大肉大捧一进一出视频出来呀 | 男女性色大片免费网站 | 久久久无码中文字幕久... | 中文字幕无码日韩专区 | 国产成人一区二区三区在线观看 | 99视频精品全部免费免费观看 | 国产精品99爱免费视频 | 亚洲国产av精品一区二区蜜芽 | 国产人妻人伦精品 | 啦啦啦www在线观看免费视频 | 亚洲国产高清在线观看视频 | aa片在线观看视频在线播放 | 国内老熟妇对白xxxxhd | 狠狠色丁香久久婷婷综合五月 | 夫妻免费无码v看片 | 日韩精品久久久肉伦网站 | 97久久国产亚洲精品超碰热 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 任你躁国产自任一区二区三区 | 日韩亚洲欧美中文高清在线 | 国内丰满熟女出轨videos | 亚洲日本va午夜在线电影 | 99久久久国产精品无码免费 | 日韩欧美中文字幕公布 | 亚洲精品一区二区三区在线观看 | 成熟人妻av无码专区 | 亚洲欧美精品aaaaaa片 | 久久久精品国产sm最大网站 | 日本丰满熟妇videos | 国产精品久久久av久久久 | 天堂亚洲免费视频 | 天堂无码人妻精品一区二区三区 | 丝袜美腿亚洲一区二区 | 精品国产一区二区三区av 性色 | 欧洲欧美人成视频在线 | 国产卡一卡二卡三 | 久久亚洲中文字幕精品一区 | 丁香花在线影院观看在线播放 | 高清国产亚洲精品自在久久 | 亚洲中文字幕在线观看 | av无码不卡在线观看免费 | 日韩欧美群交p片內射中文 | 亚洲色大成网站www | 2020最新国产自产精品 | 狂野欧美激情性xxxx | 国产无遮挡又黄又爽免费视频 | 国产精品人人爽人人做我的可爱 | 亚洲日本va午夜在线电影 | 亚洲国产日韩a在线播放 | 性欧美疯狂xxxxbbbb | 亚洲精品午夜国产va久久成人 | 无人区乱码一区二区三区 | 无码精品国产va在线观看dvd | 丰满肥臀大屁股熟妇激情视频 | 午夜理论片yy44880影院 | 东京热一精品无码av | 人妻体内射精一区二区三四 | 亚洲国产综合无码一区 | 国产成人精品优优av | 性做久久久久久久久 | 国产麻豆精品精东影业av网站 | 国产真实夫妇视频 | 亚洲 日韩 欧美 成人 在线观看 | 成人性做爰aaa片免费看不忠 | 亚洲色欲色欲天天天www | 国产高清不卡无码视频 | 国产午夜手机精彩视频 | 成 人 免费观看网站 | 国产亚洲精品久久久ai换 | 黄网在线观看免费网站 | 久久久久久久久蜜桃 | 在线观看国产一区二区三区 | 国产综合久久久久鬼色 | 亚洲成在人网站无码天堂 | 国产莉萝无码av在线播放 | 精品一区二区三区波多野结衣 | 日本熟妇人妻xxxxx人hd | 国产内射爽爽大片视频社区在线 | 亚洲 日韩 欧美 成人 在线观看 | 国产成人无码午夜视频在线观看 | 色一情一乱一伦一视频免费看 | 色综合天天综合狠狠爱 | 一本久道高清无码视频 | 97色伦图片97综合影院 | 日本护士xxxxhd少妇 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 装睡被陌生人摸出水好爽 | 人妻无码久久精品人妻 | 久久人妻内射无码一区三区 | 久久www免费人成人片 | 免费无码一区二区三区蜜桃大 | 久久久久se色偷偷亚洲精品av | 日韩精品成人一区二区三区 | 动漫av一区二区在线观看 | 久久精品国产99久久6动漫 | 一本久久a久久精品亚洲 | 牲欲强的熟妇农村老妇女视频 | 狂野欧美激情性xxxx | 国产亚洲精品久久久久久久久动漫 | 俄罗斯老熟妇色xxxx | 亚洲狠狠婷婷综合久久 | 日韩精品乱码av一区二区 | 一本大道伊人av久久综合 | 久久精品女人的天堂av | 欧美日韩在线亚洲综合国产人 | 人妻人人添人妻人人爱 | 久久99精品国产麻豆 | 久久天天躁夜夜躁狠狠 | 97精品国产97久久久久久免费 | 性生交片免费无码看人 | 日韩在线不卡免费视频一区 | 国产麻豆精品精东影业av网站 | 久久aⅴ免费观看 | 强开小婷嫩苞又嫩又紧视频 | 少妇高潮喷潮久久久影院 | 日日橹狠狠爱欧美视频 | www一区二区www免费 | 51国偷自产一区二区三区 | 人人妻人人澡人人爽精品欧美 | 亚洲男人av天堂午夜在 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲精品成人福利网站 | 亚洲小说春色综合另类 | 无码人妻精品一区二区三区下载 | 蜜桃臀无码内射一区二区三区 | 福利一区二区三区视频在线观看 | 久久久久久亚洲精品a片成人 | 国产成人无码av片在线观看不卡 | 日日摸天天摸爽爽狠狠97 | 熟妇人妻无码xxx视频 | 精品人妻人人做人人爽 | 亚洲欧美日韩国产精品一区二区 | 99久久久无码国产aaa精品 | 亚洲 高清 成人 动漫 | 99久久精品无码一区二区毛片 | 无码国产乱人伦偷精品视频 | 日本成熟视频免费视频 | 荡女精品导航 | 久久综合狠狠综合久久综合88 | 日韩在线不卡免费视频一区 | 在线观看国产一区二区三区 | 国产成人综合色在线观看网站 | 无码午夜成人1000部免费视频 | 久久伊人色av天堂九九小黄鸭 | 人妻体内射精一区二区三四 | 国产熟妇另类久久久久 | 亚洲欧美精品aaaaaa片 | 国产深夜福利视频在线 | 久久久精品456亚洲影院 | 久久综合给久久狠狠97色 | 中文字幕无码乱人伦 | 国产片av国语在线观看 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 成熟人妻av无码专区 | 午夜肉伦伦影院 | 日韩精品无码免费一区二区三区 | 国产在热线精品视频 | 日日天干夜夜狠狠爱 | 成人一在线视频日韩国产 | 无码人妻出轨黑人中文字幕 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产av无码专区亚洲a∨毛片 | 麻豆国产97在线 | 欧洲 | 亚洲大尺度无码无码专区 | 亚洲男人av天堂午夜在 | 亚洲精品一区国产 | 天下第一社区视频www日本 | 亚洲日本va中文字幕 | 丁香啪啪综合成人亚洲 | 一个人看的www免费视频在线观看 | 高中生自慰www网站 | 国产亚av手机在线观看 | 久久人人爽人人爽人人片av高清 | 99久久99久久免费精品蜜桃 | 亚洲日本va午夜在线电影 | 人妻人人添人妻人人爱 | 日韩少妇白浆无码系列 | 四虎永久在线精品免费网址 | 午夜精品一区二区三区的区别 | 99久久精品日本一区二区免费 | 色五月五月丁香亚洲综合网 | 欧美性猛交内射兽交老熟妇 | 亚洲国产欧美国产综合一区 | 男女性色大片免费网站 | 四虎影视成人永久免费观看视频 | 国产真实夫妇视频 | 一区二区三区乱码在线 | 欧洲 | 国产口爆吞精在线视频 | 亚洲精品一区二区三区在线 | 丰满诱人的人妻3 | 国产肉丝袜在线观看 | 97资源共享在线视频 | 在线а√天堂中文官网 | 亚洲中文字幕无码中文字在线 | 牲欲强的熟妇农村老妇女 | 国产精品美女久久久久av爽李琼 | 无码国内精品人妻少妇 | 乱中年女人伦av三区 | 亚洲综合无码一区二区三区 | 丰满人妻一区二区三区免费视频 | 久久午夜无码鲁丝片秋霞 | 丝袜人妻一区二区三区 | 四虎影视成人永久免费观看视频 | 国产精品99爱免费视频 | 女高中生第一次破苞av | 乱人伦人妻中文字幕无码久久网 | 成 人 网 站国产免费观看 | 国产成人精品优优av | 正在播放老肥熟妇露脸 | 国产精品视频免费播放 | 女人被男人爽到呻吟的视频 | 国产人妻人伦精品 | 午夜理论片yy44880影院 | 乱码午夜-极国产极内射 | 女高中生第一次破苞av | 欧美第一黄网免费网站 | 成人毛片一区二区 | 日日摸日日碰夜夜爽av | 欧美日韩精品 | 亚洲欧洲日本无在线码 | 亚洲国产高清在线观看视频 | 偷窥村妇洗澡毛毛多 | 99久久久国产精品无码免费 | 亚洲狠狠色丁香婷婷综合 | 曰本女人与公拘交酡免费视频 | 亚洲区小说区激情区图片区 | 国产精品99爱免费视频 | 任你躁国产自任一区二区三区 | 成人无码影片精品久久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产va免费精品观看 | 波多野结衣 黑人 | 亚洲一区二区三区在线观看网站 | 国产激情艳情在线看视频 | 又色又爽又黄的美女裸体网站 | 国产精品无套呻吟在线 | 国产熟女一区二区三区四区五区 | 一本一道久久综合久久 | 一本久道久久综合婷婷五月 | 欧美自拍另类欧美综合图片区 | 国产亚洲精品久久久闺蜜 | 国产乱人偷精品人妻a片 | 亚洲精品久久久久久久久久久 | 中文字幕无码日韩专区 | 亚洲中文字幕在线观看 | 曰韩少妇内射免费播放 | 天天摸天天透天天添 | 小鲜肉自慰网站xnxx | 强开小婷嫩苞又嫩又紧视频 | 在线亚洲高清揄拍自拍一品区 | 久久99精品久久久久久 | 麻豆国产人妻欲求不满谁演的 | 久久久国产一区二区三区 | 大乳丰满人妻中文字幕日本 | 永久免费精品精品永久-夜色 | 久久国产精品萌白酱免费 | 亚洲国产一区二区三区在线观看 | 欧美日韩精品 | 波多野结衣一区二区三区av免费 | 成在人线av无码免观看麻豆 | 日韩欧美中文字幕公布 | 精品无码一区二区三区的天堂 | 娇妻被黑人粗大高潮白浆 | 国产精品高潮呻吟av久久4虎 | 亚洲区小说区激情区图片区 | 国产av一区二区精品久久凹凸 | 国产精品视频免费播放 | 无码人妻黑人中文字幕 | 人妻少妇精品视频专区 | 狂野欧美性猛xxxx乱大交 | 丰腴饱满的极品熟妇 | 成 人影片 免费观看 | 亚洲欧美国产精品久久 | 东京无码熟妇人妻av在线网址 | 国产尤物精品视频 | 精品一区二区三区无码免费视频 | 国产精品亚洲综合色区韩国 | 97se亚洲精品一区 | 国产一区二区三区四区五区加勒比 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲va中文字幕无码久久不卡 | 7777奇米四色成人眼影 | 国产精品办公室沙发 | 国产精品久久久一区二区三区 | 亚洲va中文字幕无码久久不卡 | 天堂亚洲2017在线观看 | 双乳奶水饱满少妇呻吟 | 兔费看少妇性l交大片免费 | 亚洲欧美日韩综合久久久 | 蜜桃臀无码内射一区二区三区 | 色窝窝无码一区二区三区色欲 | 色欲久久久天天天综合网精品 | 亚洲国产精品久久久天堂 | 丰满人妻精品国产99aⅴ | 天天综合网天天综合色 | 国产精品va在线观看无码 | 精品偷拍一区二区三区在线看 | 久久亚洲中文字幕无码 | 精品人妻中文字幕有码在线 | 久久精品人人做人人综合 | 正在播放老肥熟妇露脸 | 免费乱码人妻系列无码专区 | 国内丰满熟女出轨videos | 全黄性性激高免费视频 | 日韩av激情在线观看 | 少妇一晚三次一区二区三区 | 98国产精品综合一区二区三区 | 色综合久久网 | 中文字幕人成乱码熟女app | 亚洲乱码中文字幕在线 | 欧美三级a做爰在线观看 | 亚洲国产精华液网站w | 桃花色综合影院 | 欧美野外疯狂做受xxxx高潮 | 日本高清一区免费中文视频 | 网友自拍区视频精品 | 国精品人妻无码一区二区三区蜜柚 | 久久国语露脸国产精品电影 | 国产口爆吞精在线视频 | 日本大乳高潮视频在线观看 | 国产性生交xxxxx无码 | 麻豆精品国产精华精华液好用吗 | 伊人久久婷婷五月综合97色 | 日本熟妇人妻xxxxx人hd | 女人高潮内射99精品 | 欧美日韩一区二区综合 | 午夜精品久久久内射近拍高清 | 欧美成人家庭影院 | 99在线 | 亚洲 | 天堂久久天堂av色综合 | 内射白嫩少妇超碰 | 久在线观看福利视频 | 任你躁国产自任一区二区三区 | 亚洲高清偷拍一区二区三区 | 日本www一道久久久免费榴莲 | av无码久久久久不卡免费网站 | 人人妻人人澡人人爽人人精品 | 日本欧美一区二区三区乱码 | 亚洲国产av美女网站 | 色婷婷综合激情综在线播放 | 亚洲色www成人永久网址 | 欧美猛少妇色xxxxx | 国产手机在线αⅴ片无码观看 | 国产精品国产三级国产专播 | 亚洲s色大片在线观看 | 丁香啪啪综合成人亚洲 | √8天堂资源地址中文在线 | 欧美freesex黑人又粗又大 | a国产一区二区免费入口 | 亚洲乱亚洲乱妇50p | 夜精品a片一区二区三区无码白浆 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲成av人影院在线观看 | 久久综合给合久久狠狠狠97色 | 奇米影视7777久久精品人人爽 | 西西人体www44rt大胆高清 | 午夜福利电影 | 久久久国产一区二区三区 | 久久久无码中文字幕久... | 在线欧美精品一区二区三区 | 国产精品a成v人在线播放 | av无码久久久久不卡免费网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久久久国产精品无码下载 | 精品国产一区二区三区av 性色 | 在线成人www免费观看视频 | 精品久久久无码人妻字幂 | 亚洲伊人久久精品影院 | 国产国产精品人在线视 | 免费无码av一区二区 | 色综合久久中文娱乐网 | 精品国产aⅴ无码一区二区 | 欧美人与善在线com | 76少妇精品导航 | 亚洲理论电影在线观看 | 欧美人与动性行为视频 | 国产av人人夜夜澡人人爽麻豆 | 国产超级va在线观看视频 | 日欧一片内射va在线影院 | 中文无码精品a∨在线观看不卡 | 色欲久久久天天天综合网精品 | 男女猛烈xx00免费视频试看 | 国产精品久久久久久无码 | 嫩b人妻精品一区二区三区 | 日产精品99久久久久久 | 中文字幕中文有码在线 | 中文字幕无码av波多野吉衣 | 午夜精品一区二区三区在线观看 | 亚洲精品中文字幕久久久久 | 国产乱子伦视频在线播放 | 国产精品亚洲五月天高清 | 久久久久人妻一区精品色欧美 | 国产成人综合色在线观看网站 | 98国产精品综合一区二区三区 | 亚洲综合另类小说色区 | 国产三级久久久精品麻豆三级 | 人妻夜夜爽天天爽三区 | 天堂无码人妻精品一区二区三区 | av人摸人人人澡人人超碰下载 | 国产综合在线观看 | 日日躁夜夜躁狠狠躁 | 丰满护士巨好爽好大乳 | 日韩精品无码一区二区中文字幕 | 丁香花在线影院观看在线播放 | 久久无码中文字幕免费影院蜜桃 | 国产精品久久国产精品99 | 曰韩无码二三区中文字幕 | 亚洲成av人在线观看网址 | 精品偷自拍另类在线观看 | 欧美人妻一区二区三区 | 樱花草在线播放免费中文 | 欧美 丝袜 自拍 制服 另类 | 最近免费中文字幕中文高清百度 | 少妇愉情理伦片bd | 人妻有码中文字幕在线 | 久久精品成人欧美大片 | 国产美女极度色诱视频www | 高清国产亚洲精品自在久久 | 亚洲精品中文字幕久久久久 | 中文字幕精品av一区二区五区 | 东京热无码av男人的天堂 | 日日天干夜夜狠狠爱 | 麻豆蜜桃av蜜臀av色欲av | 亚洲一区二区三区含羞草 | 国产乱人偷精品人妻a片 | a在线亚洲男人的天堂 | 色综合久久久无码网中文 | 九九综合va免费看 | 一本久久伊人热热精品中文字幕 | 大色综合色综合网站 | 国产精品永久免费视频 | 国产极品视觉盛宴 | 日日天日日夜日日摸 | 国产又粗又硬又大爽黄老大爷视 | aa片在线观看视频在线播放 | 4hu四虎永久在线观看 | 色狠狠av一区二区三区 | 婷婷色婷婷开心五月四房播播 | 日韩欧美群交p片內射中文 | 国模大胆一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 无遮挡国产高潮视频免费观看 | 一本精品99久久精品77 | 亚洲成a人片在线观看日本 | 在线成人www免费观看视频 | 性欧美牲交xxxxx视频 | 鲁一鲁av2019在线 | 伊在人天堂亚洲香蕉精品区 | 狠狠亚洲超碰狼人久久 | 色窝窝无码一区二区三区色欲 | 亚洲人成网站在线播放942 | 国内综合精品午夜久久资源 | 人妻插b视频一区二区三区 | 国产免费无码一区二区视频 | 午夜福利不卡在线视频 | 精品国产一区二区三区四区 | 欧洲精品码一区二区三区免费看 | 丰满人妻被黑人猛烈进入 | 熟女体下毛毛黑森林 | 色偷偷人人澡人人爽人人模 | 日日天干夜夜狠狠爱 | 国产成人精品一区二区在线小狼 | 97久久超碰中文字幕 | 综合激情五月综合激情五月激情1 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美精品免费观看二区 | 曰韩少妇内射免费播放 | 精品人妻中文字幕有码在线 | 国内精品久久毛片一区二区 | 精品日本一区二区三区在线观看 | 无套内射视频囯产 | 无码av岛国片在线播放 | 亚洲精品午夜无码电影网 | 日日摸夜夜摸狠狠摸婷婷 | 国产精品久久久一区二区三区 | 国産精品久久久久久久 | 成人无码视频在线观看网站 | 色诱久久久久综合网ywww | 久久 国产 尿 小便 嘘嘘 | 欧美精品国产综合久久 | 无码国产色欲xxxxx视频 | 无码人妻av免费一区二区三区 | 无套内谢的新婚少妇国语播放 | 在线观看国产午夜福利片 | 无码国产激情在线观看 | 国产激情精品一区二区三区 | 亚洲精品国产第一综合99久久 | 久久久www成人免费毛片 | 狠狠色丁香久久婷婷综合五月 | 一本大道久久东京热无码av | 欧美老人巨大xxxx做受 | 国产人成高清在线视频99最全资源 | 自拍偷自拍亚洲精品10p | 亚洲爆乳大丰满无码专区 | 亚洲伊人久久精品影院 | 最近免费中文字幕中文高清百度 | 无码人妻丰满熟妇区五十路百度 | 国产激情一区二区三区 | 婷婷五月综合缴情在线视频 | 亚洲一区av无码专区在线观看 | 久久99精品国产麻豆蜜芽 | 午夜嘿嘿嘿影院 | 国产凸凹视频一区二区 | 欧美阿v高清资源不卡在线播放 | 人妻天天爽夜夜爽一区二区 | 亚洲成色在线综合网站 | 日本www一道久久久免费榴莲 | 精品成在人线av无码免费看 | 亚洲另类伦春色综合小说 | 精品国产国产综合精品 | 国产办公室秘书无码精品99 | 午夜精品久久久内射近拍高清 | 亚洲国产av精品一区二区蜜芽 | 欧美人与善在线com | 一本大道伊人av久久综合 | 亚洲熟妇色xxxxx欧美老妇 | 性欧美熟妇videofreesex | 无码人妻精品一区二区三区下载 | 夜夜夜高潮夜夜爽夜夜爰爰 | 色五月丁香五月综合五月 | 亚洲精品国偷拍自产在线观看蜜桃 | 麻豆av传媒蜜桃天美传媒 | 精品国产乱码久久久久乱码 | 亚洲精品国偷拍自产在线观看蜜桃 | 宝宝好涨水快流出来免费视频 | 亚洲国产日韩a在线播放 | 国产精品久久福利网站 | av小次郎收藏 | 亚洲午夜久久久影院 | 亚洲成av人片天堂网无码】 | 无码吃奶揉捏奶头高潮视频 | 强奷人妻日本中文字幕 | 狂野欧美激情性xxxx | 亚洲国产精品无码久久久久高潮 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲国产精品无码一区二区三区 | 97夜夜澡人人爽人人喊中国片 | 亚洲日韩av一区二区三区中文 | 亚洲 激情 小说 另类 欧美 | 未满小14洗澡无码视频网站 | 日韩精品无码一区二区中文字幕 | 国产无av码在线观看 | 国产一区二区不卡老阿姨 | 国产精品无码永久免费888 | 67194成是人免费无码 | 亚洲熟妇色xxxxx欧美老妇y | 久热国产vs视频在线观看 | 中文字幕 人妻熟女 | www成人国产高清内射 | 国产人妻久久精品二区三区老狼 | 国产xxx69麻豆国语对白 | 精品人妻人人做人人爽 | 亚洲一区二区三区偷拍女厕 | 国产sm调教视频在线观看 | 5858s亚洲色大成网站www | 久久午夜无码鲁丝片秋霞 | 熟妇女人妻丰满少妇中文字幕 | 76少妇精品导航 | 扒开双腿疯狂进出爽爽爽视频 | 青青久在线视频免费观看 | 女人和拘做爰正片视频 | 97久久国产亚洲精品超碰热 | 亚洲午夜福利在线观看 | 性做久久久久久久免费看 | 亚洲 日韩 欧美 成人 在线观看 | 国产欧美精品一区二区三区 | 国产综合色产在线精品 | 18精品久久久无码午夜福利 | 国产色视频一区二区三区 | 日本在线高清不卡免费播放 | 国产精品久免费的黄网站 | 国产麻豆精品一区二区三区v视界 | 成 人 免费观看网站 | 麻豆av传媒蜜桃天美传媒 | 一本色道久久综合亚洲精品不卡 | 97久久精品无码一区二区 | 2020最新国产自产精品 | 水蜜桃亚洲一二三四在线 | 成人精品视频一区二区 | 中国大陆精品视频xxxx | 国产做国产爱免费视频 | 欧美国产日韩久久mv | 人人妻人人澡人人爽人人精品浪潮 | 国产成人综合色在线观看网站 | 日产国产精品亚洲系列 | 国产精品无码一区二区桃花视频 | 十八禁视频网站在线观看 | 色综合久久久久综合一本到桃花网 | 一个人看的www免费视频在线观看 | 精品人妻人人做人人爽 | 狠狠亚洲超碰狼人久久 | 亚洲午夜无码久久 | 欧美成人高清在线播放 | 人妻少妇精品视频专区 | 亚洲 另类 在线 欧美 制服 | 国产真实乱对白精彩久久 | 精品 日韩 国产 欧美 视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品久久久久avwww潮水 | 久久久久人妻一区精品色欧美 | 国产成人久久精品流白浆 | 无码国内精品人妻少妇 | 亚洲精品国偷拍自产在线麻豆 | 麻豆国产丝袜白领秘书在线观看 | 亚洲国产高清在线观看视频 | 天堂一区人妻无码 | 亚洲日韩av片在线观看 | 亚洲伊人久久精品影院 | 欧美老妇交乱视频在线观看 | 色综合天天综合狠狠爱 | 久久精品人人做人人综合试看 | 国产成人无码午夜视频在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 激情爆乳一区二区三区 | 少妇无码吹潮 | 久久久久免费看成人影片 | 天海翼激烈高潮到腰振不止 | 免费男性肉肉影院 | 国产肉丝袜在线观看 | 狠狠躁日日躁夜夜躁2020 | 国产精品久久精品三级 | 国产人妻精品一区二区三区不卡 | 强伦人妻一区二区三区视频18 | 国产精华av午夜在线观看 | 综合人妻久久一区二区精品 | 国产av一区二区三区最新精品 | 国内少妇偷人精品视频 | 亚洲中文字幕av在天堂 | 男人的天堂2018无码 | 久久无码人妻影院 | 日本一卡2卡3卡四卡精品网站 | 麻豆国产人妻欲求不满谁演的 | 久久综合网欧美色妞网 | 国内丰满熟女出轨videos | 扒开双腿吃奶呻吟做受视频 | 成人欧美一区二区三区黑人 | 色婷婷综合激情综在线播放 | 2020久久香蕉国产线看观看 | 超碰97人人做人人爱少妇 | 亚洲精品中文字幕 | 激情国产av做激情国产爱 | 精品国产av色一区二区深夜久久 | 免费观看又污又黄的网站 | 成在人线av无码免费 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲综合精品香蕉久久网 | 国产乱人无码伦av在线a | 亚洲中文字幕无码中文字在线 | 久久综合色之久久综合 | 骚片av蜜桃精品一区 | 亚洲一区二区三区含羞草 | 狠狠cao日日穞夜夜穞av | 日产精品99久久久久久 | 国产超碰人人爽人人做人人添 | 老头边吃奶边弄进去呻吟 | 人人爽人人澡人人人妻 | 精品夜夜澡人妻无码av蜜桃 | 在线成人www免费观看视频 | 丝袜 中出 制服 人妻 美腿 | 国产香蕉尹人综合在线观看 | 日韩欧美中文字幕公布 | 国产香蕉尹人视频在线 | 无码成人精品区在线观看 | 久久精品视频在线看15 | 亚洲 a v无 码免 费 成 人 a v | 久久精品国产精品国产精品污 | 国产九九九九九九九a片 | 日韩精品无码免费一区二区三区 | 粗大的内捧猛烈进出视频 | 久久国产精品_国产精品 | 在线观看欧美一区二区三区 | 国产高清不卡无码视频 | 日韩欧美成人免费观看 | 精品厕所偷拍各类美女tp嘘嘘 | 久青草影院在线观看国产 | 狠狠色噜噜狠狠狠7777奇米 | 国产办公室秘书无码精品99 | 一本大道久久东京热无码av | а天堂中文在线官网 | 国产美女精品一区二区三区 | 国产精品亚洲一区二区三区喷水 | 欧美国产日韩久久mv | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 欧美肥老太牲交大战 | 成人性做爰aaa片免费看不忠 | 欧洲vodafone精品性 | 久久97精品久久久久久久不卡 | 九月婷婷人人澡人人添人人爽 | 无码人妻精品一区二区三区下载 | 麻豆成人精品国产免费 | 日韩av无码一区二区三区 | 色欲av亚洲一区无码少妇 | 久久99精品久久久久久动态图 | 最近中文2019字幕第二页 | 麻豆成人精品国产免费 | 成人无码影片精品久久久 | 领导边摸边吃奶边做爽在线观看 | 亚洲综合无码一区二区三区 | 久久天天躁夜夜躁狠狠 | 国模大胆一区二区三区 | 亚洲区小说区激情区图片区 | 日韩av无码一区二区三区不卡 | 亚洲人交乣女bbw | 一本久久伊人热热精品中文字幕 | 色欲久久久天天天综合网精品 | 久久国产自偷自偷免费一区调 | 国产激情综合五月久久 | 亚洲天堂2017无码 | 精品乱码久久久久久久 | 一个人看的视频www在线 | 四虎国产精品免费久久 | 一二三四在线观看免费视频 | 国产福利视频一区二区 | 99久久久国产精品无码免费 | 奇米影视7777久久精品 |