1. 程式人生 > >Eclipse 部署Thrift 例項 & 服務模型例項演示(java)

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!

二 : 服務模型例項演示(java)

      注: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)