如何为多个线程创建一个Thrift客户端?

时间:2016-06-07 08:39:33

标签: java multithreading thrift

我在下面的代码段中有一个工作的Thrift客户端。

TTransport transport = new THttpClient(new Uri("http://localhost:8080/api/"));
TProtocol protocol = new TBinaryProtocol(transport);
TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "UserService");
UserService.Client userServiceClient = new UserService.Client(mp);
System.out.println(userServiceClient.getUserById(100));

在多线程环境中运行客户端时

threads[i] = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println(userServiceClient.getUserById(someId));
    }
}

我有一个例外:无序响应

org.apache.thrift.TApplicationException: getUserById failed: out of sequence response
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:76)

我猜原因是Thrift生成的Client不是线程安全的。 但是如果我希望多个客户端同时调用相同的方法getUserById(),我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

Thrift客户端不是为跨线程共享而设计的。如果您需要多个客户端线程,请为每个线程设置一个Thrift客户端。

  

但是如果我希望多个客户端同时调用相同的方法getUserById(),我该怎么做呢?

我们对背景知之甚少,所以我不得不猜测一下。如果问题是一次有很多此类呼叫进入,可能的解决方案可能是将呼叫分组以节省往返时间:

service wtf {
  list<string>  getUsersById( 1 : list<int> userIds)
}

这只是一个简短的想法。也许您想要返回list<user_data_struct>。出于实际原因,我还建议将返回的列表包装到结构中,这样整个事物就变得可扩展了。