thrift运行过程报错,多线程环境,docker环境

12 篇文章 0 订阅

报错信息:

terminate called after throwing an instance of 'apache::thrift::transport::TTransportException'
  what():  Frame size has negative value

错误定位:

clinet调用sever端接口时卡死。

eg:

Ia10kThriftClient<common::api::thrift::TestClient> client;
void ClientInit()
{
    client.create(IP, POST, NAME);
    client.setTimeout(10000, 10000, 10000);
    client.open();
}

void callback(const int id, const Data::data)
{
    boost::call_once(once_TOOLClientInit, &TOOLClientInit);
    try
    {
        cout<<"###add by zcq###start"<<endl;
        client->ResultData(id, data);
        cout<<"###add by zcq###end"<<endl;
        //usleep(1000); //1毫秒
    }
    catch (boost::bad_get&)
    {
        ISFLOG_ERROR << "callback reslut error";
        return;
    }
}

多线程调用,或者callback调用频繁,会导致以上报错,现象为,执行到ResultData函数此语句时,会出现两个start却没有end,猜想可能是由于thrift内部资源死锁导致,有那位高人若知望指出哈。

解决方法:

在callback中加锁。(当时不知道,苦苦撑了好几天,撸了好多代码,走了好多弯路,说多了都是泪呀)

boost::unique_lock<boost::mutex> lock(mutex);

报错信息:

clinet端报错:

terminate called after throwing an instance of 'apache::thrift::TApplicationException'
  what():  Unknown function Media:mediaResultPictureData
解决方法:

server用python

client用C++,但是python中的server有多种方法:

    # server = TServer.TSimpleServer(tMultiplexedProcessor, transport, tfactory, pfactory)
    # server = TServer.TThreadPoolServer(tMultiplexedProcessor, transport, tfactory, pfactory)
    server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
    # server = TServer.TForkingServer(processor, transport, tfactory, pfactory)
    # server = TServer.TNonblockingServer(processor, transport, tfactory, pfactory)

至于和C++之中有什么关系有待进一步研究。。。

使用

TServer.TSimpleServer【python】搞定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值