Вызов нескольких асинхронных запросов в Thrift Service с одного клиента - PullRequest
0 голосов
/ 23 июня 2019

Для моего кода необходимо вызвать несколько асинхронных запросов от одного и того же клиента к сервису 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 голосов
/ 25 июня 2019

для разрешения асинхронных вызовов, что означает, что выполнение кода продолжается после первого вызова метода "checkForPrime ()",

Не совсем. Асинхронный только означает, что вызов завершен асинхронно , и вам не нужно ждать завершения до тех пор, пока это необходимо.

Это не подразумевается, что вы можете использовать тот же клиент для выполнения другого параллельного запроса.Некоторые реализации могут поддерживать это, но текущая реализация - нет.

Несколько ожидающих вызовов требуют некоторого учета, в противном случае вы потеряетесь с ответами:

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

Теперь, к какому вызову относится первый ответ: вызов 1 или вызов 2?Трудно сказать, это может быть один из них.Без дополнительной информации клиенту с несколькими вызовами будет сложно пытаться сопоставить данные.

TAsyncClientManager обрабатывает это, ограничивая клиентов разрешением только одного ожидающего вызова одновременно.

необходимо вызвать несколько асинхронных запросов от одного и того же клиента

Почему вы считаете это необходимым?

Клиент является только посредником, средством передвижения. Если вы отправляете два электронных письма, требуется ли, чтобы они следовали по одному и тому же пути по интервалам ?Нет, потому что соответствующая информация, на которую должна опираться другая сторона (сервер), находится в содержимом сообщения, а не на транспортном уровне.

Если, однако, вам нужно хранить данные на клиенте, вы должны хранить их в специально отведенном месте вне экземпляра клиента.В любом случае, тот факт, что мы имеем дело с одним или двумя экземплярами клиента, не должен иметь большого значения.

...