Асинхронный запрос с Thrift в Java

Я ищу пример того, как сделать асинхронный запрос на Java с помощью Thrift. Глядя на сгенерированный код, это кажется возможным, но я не могу найти ни одного примера того, как.

Вот пример сгенерированного кода, который предполагает наличие асинхронного интерфейса:

...
AsyncIface {
    public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {
      private org.apache.thrift.async.TAsyncClientManager clientManager;
      private org.apache.thrift.protocol.TProtocolFactory protocolFactory;
      public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {
        this.clientManager = clientManager;
        this.protocolFactory = protocolFactory;
      }
      public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {
        return new AsyncClient(protocolFactory, clientManager, transport);
      }
    }
 ...

Любой указатель на то, как его использовать?

Ответ 1

Используйте вышеуказанный интерфейс, чтобы сделать асинхронный вызов таким же (Код упоминает Cassandra, но будет легко обобщать ваше приложение):

TNonblockingTransport transport = new TNonblockingSocket("127.0.0.1", 9160);
TAsyncClientManager clientManager = new TAsyncClientManager();
TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
Cassandra.AsyncClient client = new Cassandra.AsyncClient(protocolFactory, clientManager, transport);

Cassandra.method_call(parameters, new Callback());

Ответ 2

У вас нет никакого контекста, поэтому я дам вам основные части, которые вам понадобятся:

  • Чтобы выполнить асинхронный вызов, вам нужно сделать его в потоке
  • Чтобы получить результат, вам потребуется какой-то обратный вызов

Ниже представлен базовый пример этих элементов в игре:

final MyClient client;  // Who will get a call back to the their sendResult() method when asynch call finished
ExecutorService executor = Executors.newSingleThreadExecutor(); // Handy way to run code in a thread
Runnable task = new Runnable() { 
    public void run() { // Where the "do the call" code sits
        int result = someService.call(someParamter);
        client.sendResult(result); // For example, expecting an int result
    }
};
executor.submit(task); // This scheduled the runnable to be run