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

最近加班做了一个项目,在程序中使用Fget32函数来获取一个receive buffer的时候,程序报错:LIBFML_CAT:3: ERROR: No space in fielded buffer,初步查看程序没发现什么明显问题。

求助于万能的官方文档,但是很含糊:

An attempt was made to add a field to a buffer, change a field to a larger value within a buffer, merge two buffers, or otherwise modify a buffer, and not enough space is available to complete the operation.


建议解决办法是:

Use Frealloc dynamically to allocate a larger buffer or use Fcpy to copy the buffer to a larger buffer, and retry the operation。


让我去查看Fcpy(3fml), Frealloc(3fml)这两个函数,这是肿么啦?我是取返回的buffer难道空间不够?直接查看了tpalloc函数,发现小小的返回buffer不至于连续发5笔就空间不够了,再次查看了Fget32函数:

if( Fget32( rcvbuf, BUFFER, 0, strRcvBuffer, &fldLen)== -1){
      lr_log_message("get BUFFER failed. [%d: %s]\n", Ferror32, Fstrerror32(Ferror32) );
}
if( fldLen > 1024 ) {
      strRcvBuffer[1023] = 0;
}


难道是strRcvBuffer不够?设置更大也不管用,单步运行是可以的,连续发5笔就不行了,百思不得其解。

后来只有求助于万能的度娘、谷姐了,首先参考了Fget32的原型函数,修改第5位参数为0,程序连续调试通过,更加迷茫了,第5位参数不就是一个maxlen吗?咋会出现不要送,让它默认赋值buffer长度就可以了呢?

经反复测试发现,fldLen这个参数被Fget32赋值后,如果你上一次返回的存取长度大于本次返回存取长度,那是没有问题的,如果你上一次返回的存取长度小于本次返回存取长度,哈哈,你就等着中标吧?LIBFML_CAT:3: ERROR: No space in fielded buffer,解决这个问题的办法就是:

1.第5位参数赋值为0,让它每次自动给出长度

2.第5位参数使用前,一定要让他初始化

搞得我好辛苦,星期天加班,星期一凌晨发博文!上海,注定不是该来的地方啊!

--转自
北京联动北方科技有限公司




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