[转帖]    用C#开发TUXEDO客户端(四)_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4797 | 回复: 0   主题: [转帖]    用C#开发TUXEDO客户端(四)        下一篇 
guoyongwei
注册用户
等级:少校
经验:910
发帖:52
精华:6
注册:2013-3-11
状态:离线
发送短消息息给guoyongwei 加好友    发送短消息息给guoyongwei 发消息
发表于: IP:您无权察看 2013-3-15 10:51:55 | [全部帖] [楼主帖] 楼主

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以在程序中处理。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论