3.6 tpcancel取消由tpacall发送的请求的响应
取消由tpacall发送的请求的响应,在没有事务未完时。不能取消一个已经处理的请求。
int tpcancel(int handle);
参数说明:
handle:tpacall返回的描述符;
出错返回-1。错误原因有:
错误的描述符;
当前在事务模式;
其他错误;
3.7 tpcall同步发送请求并接收回应数据
同步发送请求并接收回应数据。
int tpcall(char *service, char *sbufp, long slength, \
char **rbufpp, long *rlength, long flags);
参数说明:
service:请求的service名;
bufp:发送buffer的地址;
slength:发送数据长度(只CARRAY使用,其他为0);
rbufpp:响应buffer的地址的地址,可以与发送buffer为同一块区域;
rlength:响应buffer的长度的地址(不能为NULL);
flags:标志。有如下值(含义见tpacall和tpgetrply):
TPNOTRAN:该次调用不能在一个事务里;
TPNOREPLY:不需要回应(reply);
TPNOBLOCK:非阻塞;
TPNOTIME:不超时,一直等待;
TPSIGRSTRT:被信号中断的系统调用重启。
返回-1表示出错,其他返回值都表示成功。
错误原因与tpacall和tpgetrply相同,除了描述符错。
3.8 tpgprio获得上一次请求或接收的消息的优先级
获得上一次请求或接收的消息的优先级。
int tpgprio();
成功返回的范围是1-100,值越大优先级越高。失败返回-1。
使用举例:
struct {
int hdl;
int pr;
} pa[SIZE];
for (i=0; i < requests; i++) {
pa [i].hdl = tpacall(Svc, buf, len, flags);
pa[i].pr = tpgprio();
}
qsort((char*) pa, requests, sizeof(pa[0]), cmpfcn);
for (i=0; i< requests; i++) {
tpgetrply(&pa[i].hdl, &rbufp, &rlen, rflags);
}
3.9 tpsprio设置下一个要发送的消息的优先级
设置下一个要发送的消息的优先级。
int tpsprio (int prio, long flags);
参数说明:
prio:要设置的优先级;
flags:标志。有如下值:
0:使用相对优先级,值改为(default+prio);
TPABSOLUTE:绝对优先级,值改为prio;
优先级的范围是1-100,超过次限制的值被改为相应的最大(小)值。
失败返回-1。错误原因有TPEINVAL、TPEPROTO、TPESYSTEM、和TPEOS。
-------------------------------------------------------------------
后记:再谈字符集问题
在tuxedo返回消息的格式定义中,如果采用定长字串组合的方式(表笑,我们的业务系统就是这么干的),会造成一些意外的困难。
如下:如果返回值格式的定义是:
%4s%2s // 一个4字节的串,一个2字节的串
有一个返回值是:
Aaaabb
在C语言中以sscanf()来结析这个串很容易:
char s1[5],s2[3];
Sscanf(“AAAABB”, “%4s%2s”, s1,s2)
但是在C#, java中,由于没有sscanf这个函数,就不得不手工写截字串的函数,这样的数据还可以应付。但继续考虑以下的情况:
char s1[5],s2[3];
Sscanf(“中国红”, “%4s%2s”, s1,s2)
在有汉字的情况下,使用ANSI字符集的程序在sscanf之后,结果是s1=”中国”, s2=”红”.
而在C#等用unicode字符集的程序中,截取4个字符的结果将会出错,因为整个字串才只有3个字符。
因此,在unicode程序中对这个字串解析,就必须先把字串从unicode串以GB18030编码转换为字节组,然后再对字节流进行截取,截取的结果,又必须转换为unicode以在程序中处理。