多线程JNI使用TUXEDO客户端问题

博客详细记录了一次Tuxedo客户端在高并发下通讯卡死的问题,通过排查内存回收和JNI函数,发现tpinit调用导致阻塞。设置TPMULTICONTEXTS标志启用多会话模式后,问题得到解决,确保了客户端在多线程环境下的稳定通讯。
摘要由CSDN通过智能技术生成

测试的时候,报文正常通过,一段时间之后,出现报文全部卡死,之后所有报文都不能正常通讯。(顶不住压力,交易量大就死)

1、重启平台之后,通讯暂时恢复,一段时间之后有卡死。

2、最开始怀疑,内存未回收,jni的变量和tuxedo的变量未回收,检查是否都tpfree和release掉。

3、跟踪jni的程序,发现进入jni函数之后,tpinit出现阻塞,导致之后所有交易都卡到,进jni的c程序之后。

4、去掉tpinit之后,发现程序都阻塞到了,tpcall里面。不tpinit,tpcall自动tpinit。

5、设置tuxedo 客户端,多会话模式,问题解决。

TPINIT * tpinfo = NULL ;
tpinfo = (TPINIT *)tpalloc("TPINIT", NULL, TPINITNEED(32));
if(tpinfo != NULL) {
        // 设置多会话模式,适配多线程模式
        tpinfo->flags = TPMULTICONTEXTS;
} else {
        printf("tpalloc(TPINIT)失败\n");
        return -1;
}

if ( tpinit(tpinfo) == -1 ) {
        printf("tpinit err\n");
        tpfree((char *)tpinfo);
        return -1;
}
tpfree((char *)tpinfo);

tuxedo 客户端使用多线程时
在初始化时设置多上下文

当客户端准备好加入应用程序时,指定tpinit()并设置TPMULTICONTEXTS标志

	tpinitbuf = tpalloc(TPINIT, NULL, TPINITNEED(0)); 
	tpinitbuf->flags = TPMULTICONTEXTS; 
	if(tpinit(tpinitbuf)== -1{
    		ERROR_PROCESSING_CODE
 	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值