Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asynchronous request with Thrift in Java

I'm looking for an example of how to make an asynchronous request in Java using Thrift. Looking at the generated code this seems to be possible, but I can't find a single example of how.

Here is an example of generated code that suggest the existence of an Asynchronous interface:

...
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);
      }
    }
 ...

Any pointer on how to use it?

like image 207
MasterScrat Avatar asked Sep 19 '11 00:09

MasterScrat


2 Answers

Use the above interface to make the async call like this (The code mentions Cassandra but will easily generalize to your application):

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());
like image 134
Ishan Avatar answered Sep 28 '22 09:09

Ishan


You haven't given any context, so I'll give you the basic parts you'll need:

  • To perform an asynchronous call, you'll need make it in a thread
  • To get the result, you'll need some kind of call back

The following represents a basic example of these elements in play:

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
like image 22
Bohemian Avatar answered Sep 28 '22 09:09

Bohemian