Tuxedo入门学习

来源:互联网 发布:红包掉落js 编辑:程序博客网 时间:2024/06/06 15:48

Tuxedo是什么?

Tuxedo:Transaction for Unix has been Extended for Distributed Operation分布式操作扩展之后的Unix事务系统。

Tuxedo是一个事务处理(TP)监督器(transaction processing monitor),它管理联机事务处理(OLTP)系统操作的事务。客户通过结构化查询语言(SQL)调用,或其它类型的请求,产生对服务器的请求。这个事务处理监督器确信,正确地进行了修改,以保证数据的完整性。这在一个事务可以改变多个位置的数据库的分布式数据库环境是非常重要的。这个事务处理监督器使用双阶段提交,以保证所有的数据库都已经接收和认可了这些数据的正确性。否则,这个数据库返回它的事务前状态

WTC:WebLogic Tuxedo Connector

OLTP:On-Line Transaction Processing 联机事务处理

OLAP:On-Line Analytical Processing 联机分析处理

ATMI:application-to-Transaction Monitor Interface 应用程序到事务监视器接口

DTP:Distributed Transaction Processing分布式事务处理

MSSQMutile Server,Singal Queue

 

TUXEDO采用三层结构的组件软件模型

Client为第一逻辑层。实现用户交互和数据表示,向第二层的Server发请求,调用业务逻辑处理服务。

Server组件中间层,这些组件由TUXEDO管理,实现业务逻辑服务,接收服务请求,并返回服务结果。

第三层为资源管理器,比如像关系数据库。负责管理应用系统的数据资源

 

Tuxedo的核心子系统:

事务管理器 TM(Transaction Manager)

工作站 WorkStation

 Domain

队列 Queue

 

Tuxedo与 WebLogic通过WTC互联:

通常用TUXEDO实现系统的核心业务,用WEBLOGIC做为系统扩展到web的平台,实现电子商务。由WEBLOGIC调用TUXEDO上的服务,需要在Tuxedo和Weblogic之间建立连接。

WTC不仅能让WEBLOGIC调用TUXEDO中的SERVICE,而且能让TUXEDO调用WEBLOGIC中的EJB。但WTC仅能实现这两个平台之间的互联。

Tuxedo与WebLogic之间通过Domain实现互联调用,Tuxedo与Weblogic分别代表两个TDOMAIN。

使用WTC时,Tuxedo方面要配置相应的Domain配置文件(dmconfig),指明本身以及weblogic所在Domain的IP和Port。

使用WTC时Weblogic方面要做的修改是:

    —在ClassPath中,加入jamti.jar所在的路径。

    —在weblogic的配置文件,bdmconfig.xml中,加入描述两个TDOMAIN的部分

在Tuxedo和weblogic启动相应服务后,weblogic通过client端调用相应ejb,再有该ejb调用tuxedo service。

Tuxedo应用开发:

开发TUXEDO C/S系统的必要步骤:

(1)设置环境变量,通常写在setenv.sh。

(2)编码,并编译客户端/服务端程序。

(3)编写/编译Tuxedo配置文件。

(4)启动服务。

(5)测试(功能测试、压力测试)。

开发TUXEDO C/S开发的:

开发Client涉及的API:

进程管理的API:

int tpinit(TPINIT *tpinfo)

负责将Client端连接到BB,使Client端可以进一步调用ATMI函数。

TPINIT参数是一个Tuxedo定义的结构,用以存放一些安全相关的数据(必须在tuxedo的配置文件中打开security选项)。否则,可以使用NULL。

tpinit,不能在server端中出现,否则tuxedo会产生TPEPROTO(协议错)这样一个错误。

int tpterm( )

客户端调用tpterm( )切断与应用的连接,结束了客户端的TUXEDO进程.

 

Clieng与Server之间的通讯接口:

Client通过ATMI提供的API,与Server之间进行通讯,调用Server提供的服务。

通讯主要分为两种方式:

        同步方式:采用同步通讯时,Client端在向Server端发出请求后就被阻塞,等待Server端的返回。

        同步通讯方式的API:

int tpcall( char  *svc,   char *idata,   long   ilen, char  **odata,  long   *olen,  long   flags)

Svc:调用的服务(service)名称

idata:指向输入数据缓冲区指针。

ilen:  输入数据的缓冲区大小。

odata:指向输出数据缓冲区指针的指针。

olen: 输出数据缓冲区的大小的指针。

flags:通讯控制标志。

        异步方式:采用异步方式时,Client端在发出请求后,可以继续其他的任务,需要结果时,使用API去获取response队列中的结果。

        异步通信方式的API

                  — int tpacall(char *svc, char *data, long len, longflags)

                  — tpacall 调用成功后返回一个整数,称为descriptor,client使用这个整数在以后的某个时间来获取结果。

ATMI提供tpgetrply( )来获取异步调用的结果

                  — int tpgetrply(int *cd, char **data, long *len, longflags)

                  — 参数cd ,就是存放tpacall返回descriptor的指针。

无论是tpcall、tpacall以及tpgetrply,在client端和server端都可以使用。

 

Server端开发涉及的API:

l tpreturn( ):在Tuxedo中,tpreturn用来代替常规的return函数,执行tpreturn后,server将回应的数据缓冲区返回请求的发起点,交出程序的控制权。

void tpreturn(int rval, longrcode, char *data, long len, long  flags)

rval :是返回的结果,通常是TPSUCCESS, TPFAIL,  TPEXIT。

   rcode:是用户自定义的返回值,用以进一步区分返回结果。

   data  :是返回结果缓冲区。len:是缓冲区长度。

flags : 结果返回的标志,通常都是0。

l tpsvrinit()和tpsvrdone()分别用来启动和关闭服务。

如果在server的代码中,不提供这两个函数,Tuxedo将使用缺省函数。

tpsvrinit()用tpopen()缺省打开RM连接。

tpsvrdone()用tpclose()关闭RM连接。

tpsvrinit()只在服务boot起来时执行一次。相应的tpsvrdone()也只在服务shutdown时执行一次。

TUXEDO函数说明

与缓冲区使用有关的ATMI

1. 1tpalloc
char * tpalloc(char *type, char *subtype, long size)
描述:分配缓冲区
参数:type:缓冲区的类型
       subtype:缓冲区的子类型,只有VIEW有子类型,其他的缓冲区该参数要设为NULL
       long:缓冲区的大小
返回值: 成功返回一个指向所分配空间首地址的CHAR *形指针,失败返回NULL。

1.2 tprealloc
char * tprealloc(char *ptr, long size)
描述:重新分配缓冲区
参数:ptr:指向原缓冲区首地址的指针
       size:新缓冲区的大小
返回值: 成功返回一个指向新分配空间首地址的CHAR *形指针,失败返回NULL。

1.3 tpfree
void tpfree(char *bufptr)
描述:释放由TPALLOC()或TPREALLOC()分配的缓冲区
参数:bufptr:指向要释放的缓冲区首地址的指针
返回值:无
注意: 用TPALLOC(),TPREALLOC()分配的内存只能有TPFREE()释放掉,不能用FREE()

1.4 tptypes
long tptypes(char *ptr, char *type, char *subtype)
描述:返回有ptr所指向的缓冲区的类型及子类型
参数: ptr:指向要进行类型识别的缓冲区首地址的指针
      type:类型名
      subtype:子类型名(只对VIEW类型有效)
返回值:0成功,-1失败, 错误号保存在全局变量tperrno中。


常用的FML(FML32)操作函数

2.1 Falloc
FBFR* Falloc (FLDOCC F, FLDLEN V)
描述: 分配一块FML缓冲区
参数:
         FLDOCC: 该FML缓冲区的字段个数,
          FLDLEN: 该FML缓冲区的长度
返回值:成功返回一个指向该FML缓冲区首地址的指针,失败返回NULL,错误号保存在全局
变量Ferror中
注意:  该FML缓冲区不能用于TPCALL(),TPACALL(),TPRETURN()等中,在这些函数中用到的FML缓冲区只能用TPALLOC()分配。

2.2Finit
int Finit(FBFR *fbfr, FLDLEN buflen)
描述: 初始化该FML缓冲区
参数:
        fbfr: 一个指向该FML缓冲区首地址的指针
        buflen: 该FML缓冲区的长度
返回值:失败为-1, 错误号保存在全局变量Ferror中

2.3 Fadd
int Fadd(FBFR *fbfr, FLDID fieldid, char *value, FLDLEN len)
描述: 往FML缓冲区fbfr中ID为fieldid的字段增加一个值value
参数:
    fbfr:    指向该FML缓冲区首地址的指针
    fieldid: 要增加的字段的ID
    value:   要增加的值,如果时其他类型的要转化为char*
    len:     该字段的长度,如果不时CARRARY类型的,可设为0
返回值: 失败为-1, 错误号保存在全局变量Ferror中

2.4 Fchg
int Fchg(FBFR *fbfr, FLDID fieldid,int occ, char *value, FLDLEN len)
描述:  改变fbfr中ID为fieldid字段的值。
参数:
    fbfr:    指向该FML缓冲区首地址的指针
    fieldid: 要增加的字段的ID

  occ:     下标
    value:       该字段的新值,如果时其他类型的要转化为char *
    len:   该字段的长度,如果不时CARRARY类型的,可设为0
返回值:失败为-1,错误号保存在全局变量Ferror中

2.5 Fget
int Fget(FBFR *fbfr, FLDID fieldid,int occ, char *value, FLDLEN *maxlen)
描述:  从fbfr缓冲区中取ID为fieldid字段的值到value中。
参数:
    fbfr:    指向该FML缓冲区首地址的指针
    fieldid: 字段的ID
    value:   取出的值保存到该指针指向的地址中
    maxlen: 可以COPY到缓冲区value中的字符串的长度,返回值为真正COPY到该缓冲区的字符串的长度
返回值:失败为-1, 错误号保存在全局变量Ferror中

2.6 Fprint
Fprint(FBFR *fbfr)
描述: 按格式打印fbfr缓冲区的内容。一般用于程序调试中。
参数:
    fbfr:    指向该FML缓冲区首地址的指针
返回值:失败为-1, 错误号保存在全局变量Ferror中

2.7 Ferror
Ferror:和C语言中的errno类似,当调用FML(FML32)函数出错时,把错误号保存在全局变量Ferror中。

char * Fstrerror(int err)
描述:返回错误号为err的错误描述
参数:err: Ferror的值
返回值:成功返回错误描述,失败返回NULL

连接的建立与断开有关的ATMI

3.1 tpchkauth
int tpchkauth()
描述: 检查该TUXEDO SERVER所采用的安全方式
参数:无
返回值:
      TPNOAUTH:不需要认证
      TPSYSAUTH:需要口令认证
      TPAPPSUTH:需要口令认证,并且还需要应用级的认证或授权.
      -1:调用失败, 错误号保存在全局变量tperrno中。

3.2 tpinit
int tpinit(TPINIT *tpinfo)
描述: 与TUXEDO SERVER建立连接
参数:TPINFO
返回值: 失败返回-1, 错误号保存在全局变量tperrno中。


TPINIT结构体在atmi.h中的定义如下
struct tpinfo_t {

    char   usrname[MAXTIDENT+2];   /* client user name */

   char       cltname[MAXTIDENT+2];   /* application client name */

    char   passwd[MAXTIDENT+2];    /* application password */

    char   grpname[MAXTIDENT+2];   /* client group name */

    long   flags;          /* initializationflags */

    long   datalen;        /* length of app specificdata */

    long   data;           /*placeholder for app data */

};

typedef struct tpinfo_t TPINIT;

说明:username,cltname,passwd,grpname,data,datalen用于安全认证中

flags:用于定义以何种方式通知该客户端一个UNSOLICTED MESSAGE的到来.它的值可以为:
TPU-SIG
TPU-DIP
TPU-IGN
TPSA-FASTPATH
TPSA-PROTECTED

3.3 tpterm
int tpterm()
描述: 断开与TUXEDO SERVER建立连接
参数:无
返回值: 失败返回-1, 错误号保存在全局变量tperrno中。


与请求TUXEDOSERVER 有关的ATMI

4.1 tpcall
int tpcall(char *svc, char *idata, long ilen, char **odata, long  *olen, long flags)
描述:客户端同步调用服务端的名为svc的SERVICE,
参数:
*svc:SERVICE的名称
char *idata: 输入缓冲区的地址,客户端传给服务端的参数放在该缓冲区内
long ilen:   输入缓冲区的长度
char **odata 输出缓冲区的地址,服务端传给客户端的结果放在该缓冲区内
long   *olen:输出缓冲区的长度  
long flags: 调用标志,由以下几个:
TPNOTRAN
如果调用svc的客户端当前在TRANSACTION方式下,那么svc不参与当前的TRANSACTION。

TPNOCHANGE
如果服务端返回的缓冲区类型与客户端定义的缓冲区(odata)类型不一致,默认情况下,odata会转换成与服务端返回的缓冲区类型一致的类型,如果设置了该FLAG,那么当出现这种情况时,不进行缓冲区类型转换,并且会保错。

TPNOBLOCK
默认情况下,如果客户端有阻塞条件存在(如CLIENT的TCP/IP中的缓冲区满,磁盘I/O忙等),那么客户端会阻塞在那里,直到阻塞消除或超时出错。如果设置了TPNOBLOCK,当客户端有阻塞条件存在时,TPCALL()会立刻返回并报错. 注意TPNOBLOCK只对发送请求时起作用,如果在接收服务端返回的结果时有阻塞条件存在,客户端会在那里等待,直到阻塞消除或超时出错

TPNOTIME
如果客户端有阻塞条件存在,客户端会一直阻塞在那里,即使到了超时时间也不返回,但如果该客户端是在TRANSACTION模式下,当到了
事务的超时时间,还是会报超时错误并返回。

TPSIGRSTRT
如果在进行系统调用时,被信号中断,该系统调用会重新进行。
调用成功返回0,失败返回-1, 错误号保存在全局变量tperrno中。

4.2  tpacall
int tpacall(char *svc, char *data, long len, long flags)
描述: 客户端异步调用服务端的名为svc的SERVICE,不等服务端返回结果,程序可继续往下走,在某个地方调用tpgetrply()取的服务端的返回
参数:
            char *svc,char *data, long len参数的含义与tpcall()中的一样
            flags 可设置为:TPNOTRAN, TPNOREPLY,TPNOBLOCKTPNOTIME, TPSIGRSTRT.
TPNOTRAN, TPNOBLOCKTPNOTIME, TPSIGRSTRT的含义与与tpcall()中的一样
TPNOREPLY:调用tpacall()的客户端不想接收SEVER端的应答。如果设置了
TPNOREPLY:服务端不会给该客户端发送应答。
返回值: 失败返回-1,成功返回一个HANDLER,可作为tpgetrply的参数,用于取应答

4.3 tpgetrply
int tpgetrply(int *cd, char **data, long *len, long flags)
描述:取出服务端对tpacall()的应答。
参数:    cd tpacall()返回的HANDLER
char **data返回缓冲区的地址,服务端传给客户端的结果放在该缓冲区内
long   *len:返回缓冲区的长度
flags:可以是:TPNOBLOCK,TPNOTIME,TPSIGRSTRT,TPGETANY(不管cd的值,从服务
器的应答队列中取第一个可用的消息),TPNOCHANGE
返回值: 失败返回-1,错误号保存在全局变量tperrno中。

4.4 tpcancel
int tpcancel(int handle)
描述: 如果当前的程序不处于事务模式中,取消对tpacall()的应答, 如果处于事务模式中,则不能取消对tpacall()的应答,该调用会失败.
参数: tpacall()返回的HANDLER
返回值: 失败返回-1,错误号保存在全局变量tperrno中。

4.5 tpgprio
int tpgprio()
描述:返回最近发送(tpcall(),tpacall())或接收(tpgetrply())的一个消息的优先级
参数:无
返回值: 1-100消息的优先级,值越高, 优先级越高
           失败返回-1, 错误号保存在全局变量tperrno中。

struct {

int hdl; /* handle*/

int pr; /* priority*/

} pa[SIZE];

for (i=0; i<requests; i++) {

/* Determine service and data for request*/

pa [i].hdl = tpacall(Svc, buf, len, flags);

/* Save priority used to send request */

pa[i].pr = tpgprio();

}

/* Use qsort(3) routine to sort handles inpriority order */

qsort((char*) pa, requests, sizeof(pa[0]),cmpfcn);

for (i=0; i< requests; i++) {

tpgetrply(&pa[i].hdl, &rbufp,&rlen, rflags);

}

4.6tpsprio
int tpsprio (int prio, long flags)
描述: 设置下一个要发送的消息的优先级
参数: 0- prio为相对值, 设置下一个要发送的消息的优先级为现在的优先级加上prio
TPABSOLUTE: prio为绝对值, 设置下一个要发送的消息的优先级为prio
返回值: 失败返回-1,错误号保存在全局变量tperrno中。


与请求错误处理有关的ATMI

5.1 tpstrerror
char *tpstrerror(int tperrno)
描述:返回错误号为tperrno的错误描述
参数: tperrno:在atmi.h中定义的全局变量,用于标识错误号,类似于C中的errno
返回值: 失败返回NULL,成功返回错误号为tperrno的错误描述.

5.2 tperrordetail
int tperrordetail(long flags)
描述: 返回当前进程或线程最近调用ATMI的出错的更详细的描述
参数:设为0
返回值: 如果没有错误返回0,有错误返回错误描述号

5.3 tpstrerrordetail
char * tpstrerrordetail(int err, long flags)
描述: 返回错误描述号err的详细描述信息
参数:
err : tperrordetail()的返回值,
flags: 设为0
返回值: 失败返回NULL,成功返回详细描述信息




0 0
原创粉丝点击