import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.transport.TNonblockingSocket; import org.apache.thrift.TException; import org.apache.thrift.async.TAsyncMethodCall; import org.apache.thrift.async.TAsyncClientManager; import org.apache.thrift.async.AsyncMethodCallback; import TradeReporting.TradeReport; public class AsyncClient { //Class template supporting async wait and timeout private static abstract class WaitableCallback<T> implements AsyncMethodCallback<T> { private CountDownLatch latch = new CountDownLatch(1); //Synchronization Interface public void reset() { latch = new CountDownLatch(1); } public void complete() { latch.countDown(); } public boolean wait(int i) { boolean b = false; try { b = latch.await(i, TimeUnit.MILLISECONDS); } catch(Exception e) { System.out.println("[Client] await error"); } return b; } //AsyncMethodCallback<T> interface @Override public void onError(Exception ex) { if (ex instanceof TimeoutException) { System.out.println("[Client] Async call timed out"); } else { System.out.println("[Client] Async call error"); } complete(); } } //Application entry point public static void main(String[] args) throws IOException, InterruptedException, TException { //Async client and I/O stack setup TNonblockingSocket trans_ep = new TNonblockingSocket("localhost", 9090); TAsyncClientManager client_man = new TAsyncClientManager(); TradeReporting.TradeHistory.AsyncClient client = new TradeReporting.TradeHistory.AsyncClient(new TBinaryProtocol.Factory(), client_man, trans_ep); //get_last_sale() async callback handler WaitableCallback<TradeReport> wc = new WaitableCallback<TradeReport>() { @Override public void onComplete(TradeReport tr) { try { System.out.println("[Client] received [" + tr.seq_num + "] " + tr.symbol + " : " + tr.size + " @ " + tr.price); } finally { complete(); } } }; //Make async calls wc.reset(); client.get_last_sale("IBM", wc); System.out.println("[Client] get_last_sale() executing asynch..."); wc.wait(500); wc.reset(); client.get_last_sale("F", wc); wc.wait(25000); //Make an async call which will time out client.setTimeout(1000); wc.reset(); client.get_last_sale("GE", wc); wc.wait(5000); //Shutdown async client manager and close network socket client_man.stop(); trans_ep.close(); } }