对于我的代码,有必要从同一个客户端向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) ....
答案 0 :(得分:0)
允许异步调用,这意味着代码的执行在“ checkForPrime()”方法的第一次调用之后继续进行,
不完全是。 异步仅表示the call is completed asynchronously,而您不必等到完成。
不并不暗示您可以使用同一客户端执行另一个并行请求。一些实现可能支持此功能,但当前实现不支持。
多个未接来电需要进行簿记,否则您将因回复而迷失:
call 1 made --->
call 2 made --->
response arrives <----
response arrives <----
现在,第一个响应属于哪个呼叫:呼叫1或呼叫2?很难说,可能是其中之一。没有更多信息,多呼叫客户端将很难尝试关联数据。
TAsyncClientManager通过限制客户端一次只允许一个未决呼叫来处理此问题。
有必要从同一个客户端调用多个异步请求
您为什么认为有必要?
客户端只是中介者,是一种运输手段。如果您发送两封电子邮件,是否要求电子邮件在interwebs上遵循完全相同的路径?不,因为另一端(服务器)应依赖的相关信息在消息内容中,而不是在传输级别中。
但是,如果需要在客户端存储数据,则应将其存储在客户端实例之外的专用位置。无论哪种方式,我们处理一个或两个客户端实例的事实都不重要。