对于我的代码,需要从同一个客户端向Thrift服务调用多个异步请求。
因此,我使用非阻塞服务器和异步客户端(请参阅下面的代码)来允许异步调用,这意味着代码在第一次调用"checkForPrime()“方法(我在Thrift Service上调用该方法)后继续执行。现在,这似乎只在执行一个调用时起作用。如果我在之后立即进行第二次异步调用,我会收到以下错误消息:
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) ....
发布于 2019-06-25 20:51:23
允许异步调用的
,这意味着代码在第一次调用"checkForPrime()“方法后继续执行,
不完全是。Asynchronous只意味着 和你不必等到必要的时候才完成。
这并不意味着你可以使用同一个客户端来做另一个并行请求。意味着你可以使用同一个客户端来做另一个并行请求。一些实现可能支持这一点,但当前的实现不支持。
多个未完成的呼叫需要一些记账,否则您将迷失在响应中:
call 1 made --->
call 2 made --->
response arrives <----
response arrives <----
现在,第一个响应属于哪个呼叫:呼叫1还是呼叫2?很难说,它可能是其中之一。如果没有更多的信息,多呼叫客户端将很难尝试关联数据。
TAsyncClientManager通过将客户端限制为一次仅允许一个挂起的呼叫来处理此问题。
需要从同一客户端调用多个异步请求
你为什么认为这是必要的?
客户端只是一个中介者,一种传输方式。如果您发送两封电子邮件,您是否要求这两封电子邮件在interwebs上遵循完全相同的路径?不是,因为对方(服务器)应该依赖的相关信息是在消息内容中,而不是在传输级别。
但是,如果您需要在客户端存储数据,则应将其存储在客户端实例外部的专用位置。无论哪种方式,我们处理一个或两个客户端实例的事实都不应该真正重要。
https://stackoverflow.com/questions/56721394
复制