从单个客户端向Thrift Service调用多个异步请求

时间:2019-06-23 05:52:50

标签: java asynchronous thrift

对于我的代码,有必要从同一个客户端向Thrift服务调用多个异步请求。

因此,我正在使用非阻塞服务器和异步客户端(请参见下面的代码)来允许异步调用,这意味着代码的执行在“ checkForPrime()”方法的第一次调用后继续进行。节俭服务。 现在,这似乎只能执行一个调用。如果我之后立即进行第二次异步调用,则会收到以下错误消息:

Client is currently executing another method: 
Interfaces.PrimeCheck$AsyncClient$checkForPrime_call
    at 
org.apache.thrift.async.TAsyncClient.checkReady(TAsyncClient.java:78)
    at 
Interfaces.PrimeCheck$AsyncClient.checkForPrime(PrimeCheck.java:110)
    at ThriftClient.main(ThriftClient.java:40)

我需要一个聪明的解决方案来允许多个呼叫,但是它必须来自同一客户端。欢迎任何建议。如果您需要更多信息,请不要犹豫。

        org.apache.thrift.protocol.TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory();
        TAsyncClientManager manager;
        TNonblockingSocket socket;
        AsyncClient client;
        try {
            manager = new TAsyncClientManager();
            socket =new TNonblockingSocket("localhost", 4711);
            client = new AsyncClient(factory, manager, socket);
            client.checkForPrime(5, resultHandler);
            client.checkForPrime(7, resultHandler);
            Thread.sleep(100);
        } catch (IOException e2) ....

1 个答案:

答案 0 :(得分:0)

  

允许异步调用,这意味着代码的执行在“ checkForPrime()”方法的第一次调用之后继续进行,

不完全是。 异步仅表示the call is completed asynchronously,而您不必等到完成

并不暗示您可以使用同一客户端执行另一个并行请求。一些实现可能支持此功能,但当前实现不支持。

多个未接来电需要进行簿记,否则您将因回复而迷失:

 call 1 made --->
 call 2 made --->
 response arrives <----
 response arrives <----

现在,第一个响应属于哪个呼叫:呼叫1或呼叫2?很难说,可能是其中之一。没有更多信息,多呼叫客户端将很难尝试关联数据。

TAsyncClientManager通过限制客户端一次只允许一个未决呼叫来处理此问题。

  

有必要从同一个客户端调用多个异步请求

您为什么认为有必要?

客户端只是中介者,是一种运输手段。如果您发送两封电子邮件,是否要求电子邮件在interwebs上遵循完全相同的路径?不,因为另一端(服务器)应依赖的相关信息在消息内容中,而不是在传输级别中。

但是,如果需要在客户端存储数据,则应将其存储在客户端实例之外的专用位置。无论哪种方式,我们处理一个或两个客户端实例的事实都不重要。