BEA Tuxedo编程简介
BEA TUXEDO编程简介 ................................................................. 1
一、 BEA TUXEDO 简介 ................................................................. 1
二、BEA TUXEDO配置文件UBBCONFIG .................................. 3
三、BEA TUXEDO常见配置错误 .................................................. 6
四、BEA TUXEDO常用命令 .......................................................... 7
五、常用BEA TUXEDO函数: ................................................... 8
六、常见错误分析: ................................................................... 18
一、 BEA Tuxedo 简介
关于UBBCONFIG文件的一些设置:
The cost incurred by increasing MAXACCESSERS is one additional semaphore per site per client or server process (accesser—see note that follows). There is a small fixed semaphore overhead for system processes in addition to that added by the MAXACCESSERS value. The cost of increasing MAXSERVERS and MAXSERVICES is a small amount of shared memory that is kept for each server, service, and client entry,respectively. The general idea for these parameters is to allow for future growth of the application. It is more important to scrutinize MAXACCESSERS.
Note: The system allocates one semaphore for each access slot to the bulletin board.
A semaphore is a latch circuit that prevents more than one process from accessing the same shared memory in the bulletin board at the same time.
For BEA Tuxedo pre-Release 7.1 (6.5 or earlier), both the MAXACCESSERS and MAXSERVERS parameters for an application play a part in the user license checking scheme. Specifically, a machine is not allowed to boot if the number of MAXACCESSERS for that machine + the number of MAXACCESSERS for the machine (or machines) already running in the application is greater than the number of MAXSERVERS + user licenses
for the application. Thus, the total number of MAXACCESSERS for an application must be less than or equal to the number of MAXSERVERS + user licenses for the application.
First of All ——— 设置合理的操作系统核心参数!!
# 用tmunloadcf > generated.ubb 可以得出目前配置得UBB文件所有得参数值(没有设置的有缺省值)
# 用tmloadcf –c或tmboot –c可以计算出当前UBB配置的Tuxedo启动最少要占用的系统IPC资源。
SEMMNSMaximum number of semaphores in the system. The minimum requirement for SEMMNS is
MAXACCESSERS - MAXWSCLIENTS + 13
SEMMNI
Maximum number of active semaphore sets
SEMMSL
Maximum number of semaphores per semaphore set. SEMMNI and SEMMSL are commonly chosen so that their product equals SEMMNS. The BEA Tuxedo system does not perform semaphore operations on semaphore sets; however, it attempts to allocate as many semaphores per semaphore set as possible
SEMMAP
Size of the control map used to manage semaphore sets. SEMMAP should be equal to SEMMNI
SEMMNU
Number of undo structures in the system. Because an undo structure is needed for each process that can access the Bulletin Board, SEMMNU must be at least as large as SEMMNS
SEMUME
Maximum number of undo entries per undo structure. The value 1 suffices.
二、BEA Tuxedo配置文件UBBCONFIG
UBB配置文件分成*RESOURCES,*GROUP,*SERVER,*SERVICE,*NETWORK等若干节。DEFAULT表示该节中所有对象共有的缺省属性。
*RESOURCES
#RESOUCES节提供整个系统的基本参数。
IPCKEY 55555 (32767-262143)
#进行IPC通讯的key值
DOMAINID unicom
#DOMAIN的ID值
MASTER unicom1,unicom2
#指定DOMAIN中的管理主机为unicom1,运行过程中unicom1若出现问题,管理主机切换至unicom2
MAXACCESSERS 1000
#这里该值表示整个系统中单个机器上可以访问TUXEDO的最多的Client和Server的总数(可以访问 BBL的最大进程数),应大于license用户数+server数(副本应记入)。该字段会被MACHINE部分的MAXACCESSERS覆盖。
#系统核心参数中SEMAPHORE的数目(SEMMNS)要大于这里的MAXACCESSERS数目,而ipc消息个数(MSGMAX)应大于MAXACCESSERS数+所有带REPLYQ的SERVER的个数。
MAXSERVERS 80
#最大的server数(副本应记入)
MAXSERVICES 200
#最大的service数(多个server重复记入)
MAXGTT 20
#系统最多的并发的全局交易数目
MODEL MP
#表示cluster方式,否则为SHM
OPTIONS LAN,MIGRATE
#多机cluster方式时必须指定为LAN方式,MIGRATE表示可以以组为单位进行机器间SERVER的迁移。
LDBAL Y
#允许负载均衡
SCANUNIT 10
#SCANUNIT 是BBL在所有服务请求中定期扫描以寻找超时的交易和被阻塞德调用和德间隔时间(秒)。这个参数指定BBL扫描间隔时间的基本单位, 它会影响在tpbegin中指定的交易超时时间和用BLOCKTIME指定的请求阻塞超时时间的精确程度。SANITYSCAN, BBLQUERY, DBBLWAIT, BLOCKTIME等参数都是SCANUNIT
的倍数,而不是实际秒数。而作为时间单位SCANUNIT必须是5的倍数,并且满足0<SCANUNIT<60。
SANITYSCAN 12
#SANITYSCAN的值指定在每个MACHINE上BBL自动检测所有进程的时间间隔,以SCANUNIT为单元。缺省值满足(SCANUNIT*SANITYSCAN)约为120秒。
DBBLWAIT 2
#DBBLWAIT的值指定DBBL扫描BBL时等待所有BBL应答的最大时间,以SCANUNIT为单元,即超过DBBLWAIT*SCANUNIT(秒)就超时。每一次DBBL将请求转发给它的BBL时,BBL会在请求返回结果之前先回复一个肯定的应答。这样可以定时检测死掉或不正常的BBL。缺省值满足(SCANUNIT*DBBLWAIT)的值等于SCANUNIT和20秒两者之间的最大者。
BBLQUERY 30
#BBLQUERY指定DBBL对所有BBL进行状态检查的时间间隔,它也是以SCANUNIT为计算单位。如果DBBL的状态询问没有回答,该BBL就被‘隔离’了。缺省值满足(SCANUNIT * BBLQUERY) 约为 300秒。
BLOCKTIME 6
#BLOCKTIME指定在阻塞队列中的被阻塞请求的超时时间(包括客户端从tpinit到tpterm的等待时间),以SCANUNIT为计算单位。缺省值满足(SCANUNIT * BLOCKTIME) 约为60秒。
*MACHINES
DEFAULT:
#该部分对各主机进行描述。
unicom2 LMID=unicom2
APPDIR="/usr/tuxedo/apps/simpapp"
TUXCONFIG="/usr/tuxedo/apps/simpapp/tuxconfig"
TUXDIR="/usr/tuxedo"
UID=17
GID=26
MAXACCESSERS=100
unicom1 LMID=unicom1
APPDIR="/usr/tuxedo/apps/simpapp"
TUXCONFIG="/usr/tuxedo/apps/simpapp/tuxconfig"
TUXDIR="/usr/tuxedo"
UID=17
GID=26
MAXWSCLIENTS=50
#unicom2, unicom1为网络主机名用hostname获得。
#LMID:Logical Machines ID 为tuxedo对主机的内部逻辑命名。
#APPDIR要求放置SERVER的可执行文件。
#TUXCONFIG为全路径的二进制配置文件,要求和环境变量TUXCONFIG相同。对于master机tuxconfig文件是由tmloadcf生成的,而非master机则是由tmboot启动后由tlisten从master机上拷贝获得。
#TUXDIR为tuxedo安装目录,要求和环境变量TUXDIR相同。
#MAXWSCLIENTS表示可连接client的最大个数。
*GROUPS
#GROUP1为组名,LMID表示该组运行的主机,GRPNO为组号,OPENINFO为该组通过XA打开RM(通常指数据库)的初始串。
GROUP1 LMID=unicom2 GRPNO=1 OPENINFO=NONE
GROUP2 LMID=unicom3 GRPNO=2 OPENINFO=NONE
*SERVERS
#这里描述应用服务器。SRVGRP的该SERVER所属组名,SRVID为服务器ID号,MIN表示该服务器CLOPT提供运行的相关参数,要求是‖-A -- ….‖,可以在应用服务器的srvinit函数中获得这些参数。
DEFAULT:
CLOPT="-A"
BillServer SRVGRP=GROUP1 SRVID=1 MIN=2 MAX=4
RQADDR=QNAME REPLYQ=Y
CLOPT="-A -o ./out.log –r -e ./err.log --
-p [L][low_water][,[terminate_time]][:[high_water][,create_time]] 如果MAX>1,并且使用了MSSQ(RQADDR, RQPERM)的Server可以配置-p来控制进程的增加和减少。控制算法如下:如果请求队列中的请求个数大于high_water 后超过create_time 秒,就增加该服务的一个新进程; 如果请求队列中的请求个数小于low_water 后超过terminate_time 秒, 就停止该服务的一个进程。low_water 缺省是平均每个服务进程有一个请求消息或者workload 50;high_water 缺省是平均每个服务进程有两个请求消息或者workload 100。create_time 缺省最小是50秒, and terminate_time 缺省最小是60秒。 注意:
使用TUXEDO的服务进程池时,用户自己在程序中如果用alarm()等系统调用来停止进程是不起作用的,但也不会报错。
[L] 标记意味着增减服务进程基于负载而不是请求队列的长度。仅用于SHM模式下并且LDBAL=Y,否则会报错 (LIBTUX_CAT:1542) ,服务进程也不会增减。
WSL
SRVGRP=GROUP2 SRVID=1 CLOPT="-A -- -n //130.36.0.103:8889 -m 3 -M 10 -x 10 -T 10"
#WSL用于和client端进行连接。-n 表示出接入点为IP:PORT方式,-m –M
表示最小和最大启动多少个WSH和前端通讯,-x则表示一个WSH和几个client端连接。-T 10表示如果client端和server连接后10分钟内没有交易请求则关闭连接。
*SERVICES
#不要求将所有的service在这里描述,当某个service有特别参数时才在SERVICE节中说明。
TOUPPER
LOAD=60 // 负载,当LDBAL=Y时有用
PRIO=80 // 服务在请求队列中的优先级
TRANSTIME=120 // 交易时间
SVCTIMEOUT=600 // 服务超时时间
*NETWORK
#NETWORK节对多机之间如何进行网络连接进行描述。
#cluster方式下要求先启动tlisten。事实上,对于非master机启动应用服务器是由tlisten完成的。
#tlisten的启动方式为
#unicom1: tlisten –l //130.36.1.101:8891
#unicom2: tlisten –l //130.36.0.102:8891
#NADDR指定网络连接的接入点。
#NLSADDR则指定tlisten的接入点。
#BRIDGE则指TCP连接所用的设备文件。
三、BEA Tuxedo常见配置错误
BEA Tuxedo服务启动时可能遇到的问题:
1、 服务启动时报错‖No space in Bulletin Board‖
增加ubb文件中的MAXACCESSERS值和MAXSERVERS
2、 Tuxedo应用程序在初始化时失败:‖Application server failed or dumped core during initialization‖
重新编译连接。
3、 Tuxedo应用程序可执行文件没找到或无法运行: ―Application server file not found or not executable‖
4、 server group的自动迁移
Automatic migration of server group
5、 缺省的启动顺序可能不是最佳的
Default boot sequence may not be optimal
6、 环境变量没有设置或设置不正确
Environment variable not set or not set properly
7、 IPCKEY以被使用:‖IPCKEY is already in use‖
将ubb文件中的IPCKEY改成另一个值。
8、 无效NETADDRESSS 。Invalid network address
9、 Met upper bound limits specified in the UBBCONFIG file
10、 Network port 被占用 Network port is in use already
11、 达到系统资源的限制 Reached limit on system resources
12、 Server boot dependency
13、 没有建立TLOG文件。TLOG file is not created
BEA Tuxedo服务shutdown时可能遇到的问题:
1、 Clients still attached 。客户端仍然保持连接
2、 Dead servers。应用服务程序Dead
3、 Shutdown sequence
四、BEA Tuxedo常用命令
buildclient:BEA Tuxedo Client端应用程序编译命令
buildclient [ -C ] [ -v ] [ {-r rmname | -w } ] [ -o name]
[ -f firstfiles] [ -l lastfiles]
说明:
-C specifies COBOL compilation.COBOL语言的编译方式
-v specifies that buildclient should work in verbose mode. In
particular, it writes the compilation command to its standard output.
Buildclient 的编译信息详细的输出到标准输出设备
-w specifies that the client is to be built using the workstation
libraries.
指出Client程序编译时连接Workstation 相应的动态库
-r rmname specifies the resource manager associated with this client. -o 输出文件名
-f 输入文件名称,一个或多个,多个以-f 分离
-l specifies one or more user files to be included in the compilation
and link edit phases of buildclient last, after the BEA Tuxedo libraries.
需要连接的非BEA Tuxedo的动态库,可以为多个,多个时以-l 分离
buildtms(transaction manager server):
buildserver:
tmboot—activates the application that is referenced in the
specified configuration file. Depending on the options used, the entire application or parts of the application are started.
tmloadcf—parses the UBBCONFIG file and loads the binary TUXCONFIG
configuration file.
tmunloadcf—unloads the TUXCONFIG configuration file.
tmconfig—dynamically updates and retrieves information about the
configuration for a running system.
dmadmin—updates the compiled DMCONFIG (binary domain configuration
file) while the system is running.
tmadmin—produces information about configuration parameters. Once
invoked, you can enter many administrative commands that duplicate the functions of other commands. For example, the tmadmin shutdown command is identical to the tmshutdown command.
tmshutdown—shuts down a set of specified BEA WebLogic Enterprise
or BEA Tuxedo servers, or removes a set of BEA WebLogic Enterprise interfaces or BEA Tuxedo services listed in a configuration file. 单个启动或关闭服务器:
要动态的启动指定的服务器必须先启动BBL服务,JSL服务,JREPSVR服务!具体做法如下: tmloadcf ubbsimple
tmadmin
>boot -B simple (simple为ubbsimple中指定的MASTER,注意B大写!)
或
>boot -M (单独启动BBL服务)
>boot -i 11 (11为ubbsimpel中定义的JSL的SRVID)
BBL服务和JSL服务均成功启动后,可以启动wlserver。
wlserver启动之后,首先启动JREPSVR服务,如下:
>boot -i 111 (111为ubbsimpel中定义的JREPSVR的SRVID)
再启动用户自己定义的服务,如下:
>boot -i 1 (1为ubbsimpel中定义的simpserv的SRVID)
关闭指定服务器:
>shutdown -i 1 (1为ubbsimpel中定义的simpserv的SRVID)
通过以上方法,可以动态加载服务器,而不需要把整个Tuxedo服务重启!
五、常用BEA Tuxedo函数:
(一) 数据操作函数说明:
在BEA Tuxedo的数据操作过程中(与数据库中数据交互,与客户端数据交互),由于一般交互的数据较多,因此一般采用BEA Tuxedo 的FML 数据类型进行数据传输。FML(Field Modification Language )类似于Oracle 数据库中的一个表,它可以象表一样存放一个Field 的多个值,而且对于同一个FML定义中的Field ,其值的个数是可以不相同的,主要根据用户的输入值而定。
FML类型有两种大小,通常的FML 是基于16位数据接口的。对于FML16位接口限制,最多只能有8192个不同的字段,每个字段值的最大的Buffer Size 为64K。
第二种是基于32位数据接口的,它允许30 millions 的Fields ,每个Field 允许20 billions Bytes。
FML Buffers:一个Field Buffer是由Field id,name,field type,field length组成的,其定义如下所示,其中*base 10050是指对于每一个Field 其field identifier 的取值的偏移量,它决定每一个Field 在Buffer中的相对地址。
定义:
*base 10050
# name number type flags comments
name :字段名称
number::每个字段在FML Buffer中的相对位置,决定各字段的地址指针
type:字段数据类型
flags :暂时未用
Comments :注释
在定义字段时,注意*base value 中Value值的定义,首先参照上表定义,
其次注意,在自定义字段时,地址的不可重用性。如果地址重用,将会出现同一地址的字段,有的字段的值取不到。
头文件:
#include <fml.h>
#include <fml32.h>
主要函数:
说明:以上函数中,其中带32的函数表示是应用于FML32的函数。
详细描述:
1、Fadd,Fadd32:向字段中添加新的值
函数原形:
#include stdio.h>
#include "fml.h"
int Fadd(FBFR * fbfr, FLDID fieldid, char * value, FLDLEN len)
#include "fml32.h"
int Fadd32(FBFR32 * fbfr, FLDID32 fieldid, char *value, FLDLEN32 len)
参数说明:
FBFR32 * fbfr : a pointer to a given field buffer 指定FML Buffer的指针
FLDID32 fieldid: 指定的字段Field的名称(区分大小写)或ID (field identifier)
注意该值如果是字段的名称,不能以变量的形式给出,只能是字段名称
的字符串。
char *value:与Buffer定义中该字段相同内容的对象的指针
FLDLEN32 len:数据的长度,一般给NULL
Return value :如果操作错误返回 –1
2、Falloc,Falloc32:Field Buffer 分配空间并初始化
调用malloc给FML Buffer动态的分配空间,同时调用Finit进行初始化 函数原形:
#include <stdio.h>
#include "fml.h"
FBFR * Falloc(FLDOCC F, FLDLEN V)
#include "fml32.h"
FBFR32 * Falloc32(FLDOCC32 F, FLDLEN32 V)
参数说明:
F:The numbers of fields
V:The bytes of the value space
Return value :如果成功返回指针,否则返回NULL
3、Fappend,Fappend32:向Buffer中指定字段追加新值
函数原形:
#include <stdio.h>
#include "fml.h"
int Fappend(FBFR * fbfr, FLDID fieldid, char * value, FLDLEN len)
#include "fml32.h"
int Fappend32(FBFR32 * fbfr, FLDID32 fieldid, char * value, FLDLEN32 len) 参数说明:
fbfr : a pointer to a given field buffer 指定FML Buffer的指针
fieldid: 指定的字段Field的名称(区分大小写)或ID (field identifier)
char *value:与Buffer定义中该字段相同内容的对象的指针
len:数据的长度,一般给NULL
Return value :如果操作错误返回 –1
4、Fchg,Fchg32:修改指定Buffer 中指定字段的指定序列的值
函数原形:
#include <stdio.h>
#include "fml.h"
int Fchg(FBFR * fbfr, FLDID fieldid, FLDOCC oc, char * value, FLDLEN len) #include "fml32.h"
int Fchg32(FBFR32 *fbfr, FLDID32 fieldid, FLDOCC32 oc, char * value, FLDLEN32 len) 参数说明:
fbfr : a pointer to a given field buffer 指定FML Buffer的指针
fieldid: 指定的字段Field的名称(区分大小写)或ID (field identifier)
oc:Buffer中该字段的值的序列
oc 表示该字段值的一个序列,如果该序列不存在,则添加一个NULL值
如果为 –1,则以一个新的序列向Buffer中追加一个新值
char *value:与Buffer定义中该字段相同内容的对象的指针,在这里为新增值的指针 len:数据的长度,一般给0
Return value :如果操作错误返回 –1
5、Fcpy,Fcpy32:FML Buffer的相互拷贝
函数原形:
#include <stdio.h>
#include "fml.h"
int Fcpy(FBFR * dest, FBFR * src)
#include "fml32.h"
int Fcpy32(FBFR32 *dest, FBFR32 * src)
参数说明:
dest:destination fielded buffers 目标Buffer
src: source fielded buffers 源数据Buffer
Return value :如果操作错误返回 –1
6、Fdel,Fdel32:删除Buffer中指定字段的指定的一个值
函数原形:
#include stdio.h>
#include "fml.h"
int Fdel(FBFR *fbfr, FLDID fieldid, FLDOCC oc)
#include "fml32.h"
int Fdel32(FBFR32 * fbfr, FLDID32 fieldid, FLDOCC32 oc)
参数说明:
fbfr :a pointer to a given Field Buffer ,指定Buffer的数据指针
fieldid:指定字段的field identifier 可以为字段的名称或ID
oc:删除值的序列号
Return value :如果操作错误返回 –1
7、Fdelall,Fdelall32 :删除Buffer中指定字段的所有值
函数原形:
#include <stdio.h>
#include "fml.h"
int Fdelall(FBFR * fbfr, FLDID fieldid)
#include "fml32.h"
int Fdelall32(FBFR32 * fbfr, FLDID32 fieldid)
参数说明:
fbfr:a pointer to a given Field Buffer ,指定Buffer的数据指针
fieldid:指定字段的field identifier 可以为字段的名称或ID
Return value :如果操作错误返回 –1
8、Fdelete,Fdelete32:删除指定Buffer中一组field的所有值
函数原形:
#include <stdio.h>
#include "fml.h"
int Fdelete(FBFR * fbfr, FLDID *fieldid)
#include "fml32.h"
int Fdelete32(FBFR32 * fbfr, FLDID32 * fieldid)
参数说明:
fbfr:a pointer to a given Field Buffer ,指定Buffer的数据指针
fieldid:a pointer to an array of field identifiers.
Return value :如果操作错误返回 –1
附:数组的声明:FLDID field[2]; FLDID32 field[2]
9、Ffind,Ffind32:在 buffer 中查找指定字段的指定值
函数原形:
#include <stdio.h>
#include "fml.h"
char * Ffind(FBFR * fbfr, FLDID fieldid, FLDOCC oc, FLDLEN * len)
#include "fml32.h"
char * Ffind32(FBFR32 * fbfr, FLDID32 fieldid, FLDOCC32 oc, FLDLEN32 * len) 参数说明:
fbfr :a pointer to a given Field Buffer ,指定Buffer的数据指针
fieldid:指定字段的field identifier 可以为字段的名称或ID
oc:值的序列号
len:数据的长度
Return value :points to an object that has the same type as the field type
10、Ffindlast,Ffindlast32:在 buffer 中查找指定字段的最后一个值
函数原形:
#include <stdio.h>
#include "fml.h"
char * Ffindlast(FBFR * fbfr, FLDID fieldid, FLDOCC * oc, FLDLEN * len)
#include "fml32.h"
char * Ffindlast32(FBFR32 *fbfr, FLDID32 fieldid, FLDOCC32 * oc, FLDLEN32 * len) 参数说明:
fbfr :a pointer to a given Field Buffer ,指定Buffer的数据指针
fieldid:指定字段的field identifier 可以为字段的名称或ID
oc:an integer that is used to receive the occurrence number of the field.
len:数据的长度
Return value :points to an object that has the same type as the field type
11、Ffprint,Ffprint32 :打印指定Buffer的值到Stream
函数原形:
#include <stdio.h>
#include "fml.h"
int Ffprint(FBFR * fbfr, FILE * iop)
#include "fml32.h"
int Ffprint32(FBFR32 * fbfr, FILE *iop)
参数说明:
fbfr:a pointer to a given Field Buffer ,指定Buffer的数据指针
iop:输出文件流 a pointer of type FILE that points to the output stream. Return value :如果操作错误返回 –1
12、Fprint,Fprint32:打印指定Buffer的内容到标准输出设备
函数原形:
#include <stdio.h>
#include "fml.h"
int Fprint(FBFR * fbfr)
#include "fml32.h"
int Fprint32(FBFR32 * fbfr)
参数说明:
fbfr:a pointer to a given Field Buffer ,指定Buffer的数据指针
Return value:如果操作错误返回 –1
13、Ffree,Ffree32:释放Buffer占用的空间
函数原形:
#include <stdio.h>
#include "fml.h"
int Ffree(FBFR * fbfr)
#include "fml32.h"
int Ffree32(FBFR32 * fbfr)
参数说明:
fbfr:a pointer to a fielded buffer
Return value :如果操作错误返回 –1
14、Fget,Fget32:从指定的Buffer取得指定Field的指定值
函数原形:
#include <stdio.h>
#include "fml.h"
int Fget(FBFR *fbfr, FLDID fieldid, FLDOCC oc, char * value, FLDLEN* maxlen) #include "fml32.h"
int Fget32(FBFR32 * fbfr, FLDID32 fieldid, FLDOCC32 oc, char * value,FLDLEN32 *
maxlen)
参数说明:
fbfr : a pointer to a given field buffer 指定FML Buffer的指针
fieldid: 指定的字段Field的名称(区分大小写)或ID (field identifier)
oc:Buffer中该字段的值的序列
char *value:与Buffer定义中该字段相同内容的对象的指针
maxlen:数据的长度,可以为NULL
Return value :如果操作错误返回 –1
15、Fgetlast,Fgetlast32 :Get 指定Buffer中指定字段的最后一个occurrence的值 函数原形:
#include <stdio.h>
#include "fml.h"
int Fgetlast(FBFR * fbfr, FLDID fieldid, FLDOCC * oc, char * value, FLDLEN* maxlen) #include "fml32.h"
int Fgetlast32(FBFR32 * fbfr, FLDID32 fieldid, FLDOCC32 *oc,char*value,FLDLEN32* maxlen)
参数说明:
fbfr : a pointer to a given field buffer 指定FML Buffer的指针
fieldid: 指定的字段Field的名称(区分大小写)或ID (field identifier)
oc:Buffer中该字段的值的序列
char *value:与Buffer定义中该字段相同内容的对象的指针
maxlen:数据的长度,可以为NULL
Return value :如果操作错误返回 –1
16、Fldid,Fldid32:根据 field name取得 field identifier
函数原形:
#include <stdio.h>
#include "fml.h"
FLDID Fldid(char * name)
#include "fml32.h"
FLDID32 Fldid32(char * name)
参数说明:
name:字段的名称
Return value:field identifier
17、Fldtype, Fldtype32:根据 field identifier 取得 field type
函数原形:
#include <stdio.h>
#include "fml.h"
int Fldtype(FLDID fieldid)
#include "fml32.h"
int Fldtype32(FLDID32 fieldid)
参数说明:
fieldid:相应Field 的identifier
Return value:the field type 指定Field 的数据类型
18、Fname,Fname32:根据field identifier 取得 field name
函数原形:
#include <stdio.h>
#include "fml.h"
char * Fname(FLDID fieldid)
#include "fml32.h"
char * Fname32(FLDID32 fieldid)
参数说明:
fieldid:一个Field对应的identifier
Return value:相应字段的Name
19、Fnext,Fnext32:Get 指定字段的下一个值
函数原形:
#include <stdio.h>
#include "fml.h"
int Fnext(FBFR * fbfr, FLDID * fieldid, FLDOCC *oc, char *value, FLDLEN* len) #include "fml32.h"
int Fnext32(FBFR32 * fbfr, FLDID32 *fieldid, FLDOCC32 * oc, char * value,
FLDLEN32 *len)
参数说明:
fbfr : a pointer to a given field buffer 指定FML Buffer的指针
fieldid: 指定的字段Field的名称(区分大小写)或ID (field identifier)
oc:Buffer中该字段的值的序列
char *value:与Buffer定义中该字段相同内容的对象的指针
len:数据的长度,可以为NULL
Return value :如果操作错误返回 –1
20、Foccur, Foccur32:Get指定Buffer中指定Field值的个数
函数原形:
#include <stdio.h>
#include "fml.h"
FLDOCC Foccur(FBFR * fbfr, FLDID fieldid)
#include "fml32.h"
FLDOCC32 Foccur32(FBFR32 * fbfr, FLDID32 fieldid)
参数说明:
fbfr:a pointer to a given field buffer 指定FML Buffer的指针
fieldid:指定的字段Field的名称(区分大小写)或ID (field identifier)
21、Fsizeof,Fsizeof32:取得 fielded buffer 的大小
函数原形:
#include <stdio.h>
#include "fml.h"
long Fsizeof(FBFR * fbfr)
#include "fml32.h"
long Fsizeof32(FBFR32 * fbfr)
参数说明:
fbfr:a pointer to a given field buffer 指定FML Buffer的指针
Return value:FML Buffer中数据所占字节数
22、Fwrite,Fwrite32:写FML Buffer中内容到File Stream中
函数原形:
#include <stdio.h>
#include "fml.h"
int Fwrite(FBFR * fbfr, FILE * iop)
#include "fml32.h"
int Fwrite32(FBFR32 * fbfr, FILE * iop)
参数说明:
fbfr:a pointer to a given field buffer 指定FML Buffer的指针
iop:输出文件流的指针
Return value:如果操作错误返回 –1
(二)调用函数说明:
1、 tpabort 放弃当前事物处理(交易)
#include <atmi.h>
int tpabort(long flags)
参数说明:
flags:reserved for future use and should be set to 0
Return value:如果操作错误返回 –1
2、 tpalloc 为各种类型Buffer分配存储空间
函数原形:
#include <atmi.h>
char * tpalloc(char *type, char *subtype, long size)
参数说明:
type:Buffer的类型名称
subtype:Buffer的sub type 的名称,一般为空
size:为该buffer分配空间的大小,以字节为单位
Return value:a pointer to a buffer of the appropriate type aligned on a long word; 如果错误,返回NULL
3、 tpcall sending service request and awaiting its reply
函数原形:
int tpcall(char *svc, char *idata, long ilen, char **odata, long *olen, long flags)
参数说明:
svc:service name,被请求服务的名称
idata:输入参数数据指针
ilen:入参数据的长度
odata:输出参数数据指针
olen:输出数据的长度
flags:取值:
TPNOTRAN
TPNOCHANGE
TPNOBLOCK
TPNOTIME
TPSIGRSTRT
4、 tpbegin 开始一个事物处理的过程
函数原形:
#include <atmi.h>
int tpbegin(unsigned long timeout, long flags)
参数说明:
timeout:操作超时的时间限制
flags:reserved for future use and must be set to 0.
Return value:如果操作错误,返回 –1.
5、 tpcommit 提交一个事物处理
函数原形:
#include <atmi.h>
int tpcommit(long flags)
flags:reserved for future use and must be set to 0.
Return value:如果操作错误,返回 –1.
6、 tpfree 释放Buffer所占用的存储空间
函数原形:
void tpfree(char *ptr)
参数说明:
ptr:a pointer a given buffer
7、 tpreturn: 结束一个会话,返回相应值
函数原形:
void tpreturn(int rval, long rcode, char *data, long len, long flags)
参数说明:
rval:可以为以下值:
TPSUCCESS:调用的服务成功结束
TPFAIL:服务调用在某个环节出错
TPEXIT:behaves the same as TPFAIL with respect to completing the
Service。与TPFAIL的作用相同,结束服务
默认值TPFAIL
rcode:一般为0
data:data points to the data portion of a reply to be sent.。返回值的数据指针 len:返回值的数据长度如果data 为NULL,则 len is ignored.
如果data为不用指明数据长度的Buffer(如FML field buffer),则len is ignored flags:is reserved for future use and must be set to 0
例如:tpreturn(TPSUCCESS, 0, sendbuf, 0, 0);
六、常见错误分析:
在程序调试过程中经常会碰到一些错误,使程序运行不成功。
在BEA Tuxedo中有一个ULOG文件,主要用于记载程序运行过程中的一些信息,在程序调试过程中,如果碰到错误,请注意查看该文件;如果想跟踪程序里的一些变量,也可以通过写该文件达到Debug的目的。ULOG文件一般存放在应用程序的当前路径。
以下,对常见错误进行分析。
1、 服务调用过程中出现的有关服务的错误
1) 在调用服务时,可能有时用C Client可以调用Service ,但是用Jolt Client(Java
Client)Service,在WebLogic会看到如下错误代码:
Service not available
原因:相应的Service 没有在Jolt 资源库中注册,或者已经注册,但是没有Export 处理方法:在Jolt repository 中注册服务,同时Export。注意服务名,区分大小写
2) 错误代码:
TPENOENT entry not found
tpacall() call failed, tperrno = 6
原因:can’t send to svc because it does not exist
应用程序在编译时,所调用的服务没有采用 -s 导出,或者Service name错
误,服务并不存在,或者此服务意外shutdown
处理方法:检查调用时,Service name是否正确。
重新编译应用程序,注意 -s 导出所有编写的服务Service 。
boot
2、 有关数据的一些错误
1) 错误现象:在用RE.html注册服务,测试时,报错:
check log file:data conversion error
ULOG文件中记载:
Maybe FIELDTBLS not set property
原因:对于每一个FML Buffer文件,都必须在环境变量中指定,同时指明其路径 处理方法:
设置环境变量
FIELDTBLS=Usysflds,userdefine //(16 bit FML)
FIELDTBLS32= Usysfl32,evt_mib,tpadm,userdefine //(32 bit FML)
FLDTBLDIR=%TUXDIR%\udataobj;%APPDIR%
FLDTBLDIR32=%TUXDIR%\udataobj;%APPDIR%
注意16bit FML与32bit FML应该严格区分,否则,取不到数据。
在Jolt rep注册时也应注意对应关系,要不然,数据无法传输
mkfldhdr 生成16bit FML的头文件
mkfldhdr32 生成32bit FML的头文件
2) 错误现象:在程序处理过程中,某些字段数据无法传输给网页
原因:字段地址冲突,导致取不到数据
处理方法:检查各个字段其定义的字段是否有重复。
碰到这类问题时,可能无法一时检查出错误原因,建议编写一个简单的C Client
测试程序,在接受数据时,用Fprint函数打印出所有输出缓冲区的值,检查输出值与字段名是否一致。
如果数据正确,但是Java Client仍然接受不到数据,建议删除现已注册Jolt Rep的
服务,采用Bulk Loader批量载入方法,重新注册服务。
如果在所有措施采用后,仍然错误,请shutdown 所有服务,重新boot 一次,再试。 同时请注意检查ULOG文件的提示信息。
--转自