Thrift 非阻塞式IO服務模型-TNonblockingServer
阿新 • • 發佈:2019-02-14
使用非阻塞式IO,服務端和客戶端需要指定 TFramedTransport 資料傳輸的方式。
服務端HelloTNonblockingServer.java:
客戶端HelloNonblockingClient.java:package cn.slimsmart.thrift.demo.helloworld; import org.apache.thrift.TException; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.server.TNonblockingServer; import org.apache.thrift.server.TServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; /** * 註冊服務端 * 使用非阻塞式IO,服務端和客戶端需要指定 TFramedTransport 資料傳輸的方式。 TNonblockingServer */ public class HelloTNonblockingServer { // 註冊埠 public static final int SERVER_PORT = 8080; public static void main(String[] args) throws TException { //處理器 TProcessor tprocessor = new HelloWorld.Processor<HelloWorld.Iface>(new HelloWorldImpl()); // 傳輸通道 - 非阻塞方式 TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); //非同步IO,需要使用TFramedTransport,它將分塊快取讀取。 TNonblockingServer.Args tArgs = new TNonblockingServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.transportFactory(new TFramedTransport.Factory()); //使用高密度二進位制協議 tArgs.protocolFactory(new TCompactProtocol.Factory()); // 使用非阻塞式IO,服務端和客戶端需要指定TFramedTransport資料傳輸的方式 TServer server = new TNonblockingServer(tArgs); System.out.println("HelloTNonblockingServer start...."); server.serve(); // 啟動服務 } }
package cn.slimsmart.thrift.demo.helloworld; import org.apache.thrift.TException; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; /** * 客戶端呼叫HelloTNonblockingServer,HelloTHsHaServer * 非阻塞 */ public class HelloNonblockingClient { public static final String SERVER_IP = "127.0.0.1"; public static final int SERVER_PORT = 8080; public static final int TIMEOUT = 30000; public static void main(String[] args) throws TException { //設定傳輸通道,對於非阻塞服務,需要使用TFramedTransport,它將資料分塊傳送 TTransport transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT)); // 協議要和服務端一致 //HelloTNonblockingServer ////使用高密度二進位制協議 TProtocol protocol = new TCompactProtocol(transport); //HelloTHsHaServer ////使用二進位制協議 //TProtocol protocol = new TBinaryProtocol(transport); HelloWorld.Client client = new HelloWorld.Client(protocol); transport.open(); String result = client.sayHello("jack"); System.out.println("result : " + result); //關閉資源 transport.close(); } }