Eclipse 部署Thrift 例項 & 服務模型例項演示(java)
轉自:http://blog.csdn.net/jun55xiu/article/details/8988429
一:Eclipse 部署Thrift 例項
注:需要1:工具包thrift-0.9.0.ext (下載地址http://download.csdn.net/detail/xyw_eliot/5414527) 2: Java語言Thrift工程需要的jar包+libthrift-0.9.0.jar(下載地址http://download.csdn.net/detail/xyw_eliot/5414271或參考配置2通過ANT獲取)
1.1 自動生成初始類*.java程式碼
1.1.1 定義*.thrift檔案(以Hello.thrift檔案為例)
@下載的thrift-0.9.0.exe放置在目錄D:\Thrift下;
@編寫Hello.thrift檔案:
service Hello{
string helloString(1:string para)
i32 helloInt(1:i32 para)
bool helloBoolean(1:bool para)
void helloVoid()
string helloNull()
}
使用IDL描述性語言編寫的Thrift檔案,包括了5個方法,每個方法包含一個方法名,引數列表和返回型別。每個引數包括引數序號,引數型別以及引數名。 Thrift 是對 IDL(Interface Definition Language) 描述性語言的一種具體實現;
1.1.2 生成初始類Hello.java程式碼
將Hello.thrift檔案和thrift-0.9.0.exe放置到相同目錄下,即D:\Thrift,執行cmd,開啟視窗命令列(D: 回車 ; cd D:\Thrift )定位到D:\Thrift ,執行命令:D:\Thrift>thrift-0.9.0.exe -gen java Hello.thrift
完成後在D:\Thrift下會生成一個目錄gen-java,裡面有Hello.java
1.2 建立Java工程
開啟Eclipse或者Myeclipse,建立一個Java工程:Hello,匯入剛才生成的Hello.java檔案,同時新建一個自由資料夾,Thrift工程需要的jar包以及libthrift-0.9.0.jar放置到資料夾下,同時在Java Build Path中新增引用。
1.3 編寫HelloServiceImpl 介面,介面實現Thrift定義檔案中的服務。
import org.apache.thrift.TException;
public class HelloServiceImpl implements Hello.Iface{
public boolean helloBoolean(boolean para) throws TException{
return para;
}
public int helloInt(int para) throws TException{
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return para;
}
public String helloNull() throws TException{
return null;
}
public String helloString(String para) throws TException{
return para;
}
public void helloVoid() throws TException{
System.out.println("Hello World!");
}
}
1.4 編寫伺服器端
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;
public class HelloServiceServer {
/**
* 啟動thrift伺服器
* @param args
*/
public static void main(String[] args) {
try{
//設定伺服器埠為7911
TServerSocket serverTransport = new TServerSocket(7911);
//設定協議工廠為TBinaryProtocol.Factory
Factory proFactory = new TBinaryProtocol.Factory();
//關聯處理器與Hello服務的實現
TProcessor processor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(processor);
tArgs.protocolFactory(proFactory);
//使用TSimpleServer
TServer server = new TSimpleServer(tArgs);
System.out.println("Start server on port 7911....");
server.serve();
}catch(TTransportException e){
e.printStackTrace();
}
}
}
1.5 編寫客戶端
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
public class HelloServiceClient {
/**
* 呼叫Hello服務
* @param args
*/
public static void main(String[] args) {
try {
//設定呼叫的伺服器為本地,埠為7911
TTransport transport = new TSocket("localhost", 7911);
transport.open();
//設定傳輸協議為TBinaryProtocol
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
client.helloVoid();
transport.close();
} catch (TTransportException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.6 執行和結果
先執行伺服器端,再執行客戶端;
結果:Start server on port 7911.... Hello World!
注:Hello.java / HelloServiceImpl.java 見上生成的程式碼;
2.1 TSimpleServer服務端:單執行緒伺服器端使用標準的阻塞式 I/O,簡單的單執行緒服務模型
2.2 TThreadPoolServer 服務模型:執行緒池服務模型(多執行緒伺服器端使用標準的阻塞式I/O),使用標準的阻塞式IO,預先建立一組執行緒處理請求
2.3 TNonblockingServer 服務模型/多執行緒伺服器端使用非阻塞式 I/O :使用非阻塞式IO,服務端和客戶端需要指定 TFramedTransport 資料傳輸的方式。
2.4 THsHaServer 服務模型:半同步半非同步的服務端模型,需要指定為: TFramedTransport 資料傳輸的方式。
2.5 AsynClient 非同步客戶端
原始碼可以去我的資源裡去下載 ”thrift + 服務模型例項演示(java)“