1. 程式人生 > >Thrift 非阻塞式IO服務模型-TNonblockingServer

Thrift 非阻塞式IO服務模型-TNonblockingServer

使用非阻塞式IO,服務端和客戶端需要指定 TFramedTransport 資料傳輸的方式。

服務端HelloTNonblockingServer.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(); // 啟動服務
	}
}
客戶端HelloNonblockingClient.java
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();
	}
}