Tuxdo函数说明2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常用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 :注释
其次注意,在自定义字段时,地址的不可重用性。
如果地址重用,将会出现同一地址的字段,有的字段的值取不到。
头文件:
#include <fml.h>
#include <fml32.h>
详细描述:
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 bec ause 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文件的提示信息。