分类:
2009-07-08 21:11:32
l 定义
l 过程
l 代码例子
l 错误处理和管理类API域
在TUXEDO下管理应用有很多手段,如下:
² tmadmin
² tmadmin的脚本
² 调用ATMI
² X-Windows GUI
² JAVA applet Web GUI
² Admin API (MIB)
每一种方法都有其优点和适用场合。Admin API提供访问TUXEDO信息的控制方法和结构。这些信息被分类成组,称为管理信息库(Management Information Base—MIB)。通过Admin API可以访问MIB。使用Admin API有以下优势:
² 可访问的TUXEDO系统信息更多
² 管理应用有更高的灵活度
² 可以集成到外部系统工具中
Admin API(MIB)
TUXEDO系统组成的各个部分都有自己的MIB,每部分的MIB是一组相关的类,每个类代表一个MIB可管理的实体或项目,有其自身的属性、许可权限和语义。TUXEDO系统的MIB有5部分,如下:
² TM_MIB
² EVENT_MIB
² APPQ_MIB
² WS_MIB
² ACL_MIB
下边的例子是访问TM_MIB并显示了/T部分的管理信息库。
Admin API使用了一些预定义的FML32的域,这些数据组织存放在文件$TUXEDO/udataobj/tpadm中。环境变量必须设置如下:
FLDTBLDIR32=$TUXDIR/udataobj
FIELDTBLS32=Usysfl32,tpadm,evt_mib
Export FLDTBLDIR32 FIELDTBLS32
使用Admin API的代码范例
#include
#include
#include
#include
main(int argc, char **argv)
{
long blen;
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(“Query th 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(“Query th 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域在管理MIB信息时也非常有用。如:
在一个大应用中,server节会包含很多条目,以下3个域在取得这些信息时很有用。
TA_OCCURS |
在请求时,表示需要得到信息的行数。 在返回结果后,表示成功得到信息的行数。 |
TA_CURSOR |
表示上一次GET操作停止的位置。配合TA_OPERATION的GETNEXT属性,可以顺序遍历MIB。 |
TA_FILTER |
客户端程序可以通过该域得到一个特定域信息 |
使用Admin API发生错误时,在回应缓冲中会带回来自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(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
#include
#include
#include
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(“Query th 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(“Query th T_MACHINE class after:\n”);
Fprint32(ibuf);
printf(“\n”);
tpfree((char *)ibuf);
tpterm();
return(0);
}