Thrift-java例項
原文出自【聽雲技術部落格】:http://blog.tingyun.com/web/article/detail/1082
Thrift例項1
功能描述:客戶端與伺服器端分別是兩個應用,先啟動伺服器端,再啟動客戶端,實現執行客戶端執行伺服器端的加法方法。
原始碼截圖(原始碼在附件中):
客戶端:
TestThriftClientServlet:
SendRequestController:
Pom.xml:
服務端:
TestThriftServlet:
ThriftServerController:
IThriftServer:由thrift工具編譯生成
ThriftServerServiceImpl:
執行說明:先執行服務端TestThriftServlet,再執行客戶端TestThriftClientServlet,觀察控制檯列印出81,即:77+5=81
Thrift例項2
1、業務邏輯描述:一個系統通過使用者身份證號獲取另一個系統裡有關這個使用者的積分。
2、首先編寫指令碼檔案test.thrift:
名稱空間:
namespace java com.test
namespace是關鍵字表示名稱空間,也就是java的包,java表示指令碼轉換成java類
請求:identitycard是身份證號
struct UserRequest
{
1:string identitycard
}
返回:code是成功標識 0表示成功;integral是使用者擁有的積分
Params是返回的引數集合這裡只用一個欄位積分(integral)做例子;
struct UserResponse
{
1:string code
2:map<string,string> params
}
服務:
service ThriftCase
{
UserResponse integralService(1: UserRequest request)
}
3、到thrift官網下載
http://thrift.apache.org/
下載:thrift-0.6.1.tar.gz和Thrift compiler for Windows (thrift-0.6.1.exe)
4、用eclips裡面的ant工具把thrift-0.6.1編譯出jar包
解壓:thrift-0.6.1.tar.gz
把解壓後的資料夾放到eclipse的某個工程下如圖:
如上圖thrift-0.6.1資料夾放在名字是thrift的java工程的src下,有紅叉不必管他,然後進入到thrift-0.6.1/lib/java中,右鍵點選build.xml
如圖點選Ant Build。在build.xml同路徑下會產生一個build資料夾裡面有生成的thrift-0.6.1.jar包。把這個包放到所做的工程的lib裡就行了。
5、把thrift指令碼編譯成java類
把thrift-0.6.1.exe和test.thrift檔案放在同一個目錄下並把路徑寫進環境變數Path中,如:E:/soft/ccc/路徑下放入上述兩個檔案並把路徑寫進環境變數Path中。
在執行中鍵入cmd開啟dos介面,進到E:/soft/ccc/路徑下,執行thrift-0.6.1.exe檔案,命令如下:
E:\soft\ccc>Thrift-0.6.1 –gen java text.thrift
在這個目錄下會產生一個gen-java資料夾,資料夾中會產生相應的java類,
ThriftCase.java
UserRequest.java
UserResponse.java
將三個檔案拷貝到thrift工程的src/com/test/ 路徑下。
6、編寫服務端程式碼
服務端程式碼包含兩個類:一個是業務邏輯類,一個是socket服務類。
業務邏輯類要實現ThriftCase.Iface服務介面
package com.test;
import java.util.HashMap;
import java.util.Map;
public class ThriftCaseImpl implements ThriftCase.Iface{
public UserResponse integralService(UserRequest request) {
try{
UserResponse urp=new UserResponse();
if(request.identitycard.equals("32010619881231103X")){
urp.setCode("0");
Map params=new HashMap();
params.put("integral", "10");
urp.setParams(params);
}
System.out.print("接收引數是:identitycard="+request.identitycard);
return urp;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
Socket服務類
package com.test;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
public class TestService {
private void start(){
try {
TServerSocket serverTransport = new TServerSocket(8899);
ThriftCase.Processor processor = new ThriftCase.Processor(new ThriftCaseImpl());
//TBinaryProtocol – 二進位制編碼格式進行資料傳輸。
Factory protFactory = new TBinaryProtocol.Factory(true,true);
//TCompactProtocol 這種協議非常有效的,使用Variable-Length Quantity (VLQ) 編碼對資料進行壓縮
//Factory protFactory = new TCompactProtocol.Factory();
Args args = new Args(serverTransport);
args.processor(processor);
args.protocolFactory(protFactory);
TServer server = new TThreadPoolServer(args);
System.out.println("Starting server on port 8899 ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestService srv = new TestService();
srv.start();
}
}
7、客戶端程式碼
package com.test;
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;
import com.test.ThriftCase.Client;
public class TestClient {
private void start() {
TTransport transport;
try {
transport = new TSocket("localhost", 8899);
TProtocol protocol = new TBinaryProtocol(transport);
Client client = new Client(protocol);
UserRequest request=new UserRequest();
request.setIdentitycard("32010619881231103X");
transport.open();
com.test.UserResponse urp=client.integralService(request);
if(urp.code!=null&&!urp.code.equals("")){
System.out.println("返回程式碼:"+urp.code+"; 引數是:"+urp.params.get("integral"));
}
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestClient c = new TestClient();
c.start();
}
}
8、先開啟服務
public static void main(String[] args) {
// TODO Auto-generated method stub
TestService srv = new TestService();
srv.start();
}
控制檯顯示:
Starting server on port 8899 ...
9、再執行客戶端
public static void main(String[] args) {
TestClient c = new TestClient();
c.start();
}
控制檯顯示:
返回程式碼:0; 引數是:10
10、所需第三方包
log4j-1.2.15,
slf4j-api-1.6.1.jar
slf4j-log4j12-1.5.8.jar
相關文章
- Thrift-java學習小結Java
- 單例項刪除ASM例項單例ASM
- php例項化物件的例項方法PHP物件
- ruby中的類例項變數和例項的例項變數變數
- 2 Day DBA-管理Oracle例項-Oracle例項和例項管理概覽Oracle
- jQuery 例項jQuery
- OkHttpClient例項HTTPclient
- phpcocket例項PHP
- unittest例項
- RAC 例項 遷移到 單例項 -- 使用RMAN Duplicate單例
- UML用例圖例項解析
- js監聽鍵盤事件程式碼例項例項JS事件
- 演示中斷處理的例項(例項六)(轉)
- SQLMAP 例項COOKBOOKSQL
- ORM 例項教程ORM
- Java例項教程Java
- java介面例項Java
- YACC 例項分析
- Pull解析例項
- 管理 ASM 例項ASM
- 停止ASM例項ASM
- jQueryAjax例項演示jQuery
- 管理ORACLE例項Oracle
- 例項和物件物件
- Ant打包例項
- SQL TOP 例項SQL
- 類和例項
- 策略模式例項模式
- pinctrl使用例項
- Activiti的流程例項【ProcessInstance】與執行例項【Execution】
- JavaScript單例模式概念與例項JavaScript單例模式
- 單例模式 - 只有一個例項單例模式
- 單例與單例項之爭單例
- jQuery選項卡例項程式碼jQuery
- 如何將獨立例項轉換成叢集例項EU
- 搜尋框關鍵字智慧匹配例項程式碼例項
- RDS按量付費例項、只讀例項、OPENAPI正式釋出API
- 如何區分例項化網格中的每個例項