Apache Thrift快速入門教程

Thrift是一種跨語言RPC框架,最初是在Facebook上開發的,現在作為Apache項目開源。 這篇文章將描述如何以不同的模式(例如阻塞,非阻塞和異步)編寫Thrift服務和客戶端。

(我覺得后兩種模式的文檔較少,需要一些教程類型的介紹,因此是本文的動機。) 為了輕松地遵循本教程,您對Thrift體系結構(由傳輸,協議和處理器組成)有基本的了解是有益的。 (可以在[1]上找到好的論文)。 在這里,我將使用Thrift 0.7版和Thrift的Java綁定。

節儉安裝
可以在http://wiki.apache.org/thrift/ThriftInstallation中找到安裝說明。

總結Ubuntu安裝步驟。

1.安裝所需的依賴項。
$ sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g ++ libssl-dev
2.轉到安裝根目錄。 3. $ ./configure 4. $ make 5.成為超級用戶并 $進行安裝

現在讓我們繼續創建服務并使用它。

服務定義

此處定義了具有簡單算術運算的服務。 請注意,使用typedef指令為基本類型i64和i32聲明備用名稱。 在名為“ 算術.thrift ”的文件中添加以下內容。

namespace java tutorial.arithmetic.gen  // define namespace for java codetypedef i64 long
typedef i32 int
service ArithmeticService {  // defines simple arithmetic service
long add(1:int num1, 2:int num2),
long multiply(1:int num1, 2:int num2),
}

代碼將在“ tutorial.arithmetic.gen ”包下生成。

現在,使用以下命令行生成Java代碼。

$ thrift –gen java算術.thrift

將生成源tutorial.arithmetic.gen.ArithmeticService.java

封鎖模式

讓我們創建一個阻塞模式的服務器和一個使用服務的客戶端。

首先,我們需要使用生成的服務框架來實現服務。 要實現的接口是ArithmeticService.Iface。

public class ArithmeticServiceImpl implements ArithmeticService.Iface {public long add(int num1, int num2) throws TException {return num1 + num2;}public long multiply(int num1, int num2) throws TException {return num1 * num2;}}

現在,讓我們創建Thrift服務器,該服務器將請求此服務。 請記住,這是一臺阻塞服務器,因此執行I / O的服務器線程將等待。

public class Server {private void start() {try {TServerSocket serverTransport = new TServerSocket(7911);ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));System.out.println("Starting server on port 7911 ...");server.serve();} catch (TTransportException e) {e.printStackTrace();}}public static void main(String[] args) {Server srv = new Server();srv.start();}}

這里使用了TThreadPoolServer實現,該實現將利用線程池來處理傳入的請求。

現在讓我們編寫客戶端。

public class ArithmeticClient {private void invoke() {TTransport transport;try {transport = new TSocket("localhost", 7911);TProtocol protocol = new TBinaryProtocol(transport);ArithmeticService.Client client = new ArithmeticService.Client(protocol);transport.open();long addResult = client.add(100, 200);System.out.println("Add result: " + addResult);long multiplyResult = client.multiply(20, 40);System.out.println("Multiply result: " + multiplyResult);transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();}}public static void main(String[] args) {ArithmeticClient c = new ArithmeticClient();c.invoke();}
}

TBinaryProtocol用于對服務器和客戶端之間傳輸的數據進行編碼。 現在啟動服務器,并使用客戶端調用服務以生成結果。

非阻塞模式
現在讓我們創建一個非阻塞服務器,該服務器在下面使用Java非阻塞I / O。 我們可以使用與以前相同的服務實現(ArithmeticServiceImpl)。

public class NonblockingServer {private void start() {try {TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(7911);ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport).processor(processor));System.out.println("Starting server on port 7911 ...");server.serve();} catch (TTransportException e) {e.printStackTrace();}}public static void main(String[] args) {NonblockingServer srv = new NonblockingServer();srv.start();}
}

在這里,使用TNonblockingServerSocket封裝了ServerSocketChannel。

非阻塞客戶端的代碼如下。

public class NonblockingClient {private void invoke() {TTransport transport;try {transport = new TFramedTransport(new TSocket("localhost", 7911));TProtocol protocol = new TBinaryProtocol(transport);ArithmeticService.Client client = new ArithmeticService.Client(protocol);transport.open();long addResult = client.add(100, 200);System.out.println("Add result: " + addResult);long multiplyResult = client.multiply(20, 40);System.out.println("Multiply result: " + multiplyResult);transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();}}public static void main(String[] args) {NonblockingClient c = new NonblockingClient();c.invoke();}}

注意使用TFramedTransport包裝正常的TSocket傳輸。 非阻塞服務器要求客戶端使用TFramedTransport,它將對通過網絡發送的數據進行框架化。 啟動服務器并使用客戶端發送請求。 您將看到與以前相同的結果,這次使用非阻止模式。

異步模式

我們可以編寫異步客戶端來調用Thrift服務。 需要注冊一個回調,該回調將在請求成功完成時被調用。 阻塞模式服務器在異步客戶端上不起作用(方法調用返回的響應為空)(可能是因為我們在客戶端使用TNonblockingSocket。請參見ArithmeticService.AsyncClient的構造。因此這可能是正確的行為)。 非阻塞模式服務器似乎可以正常工作。 因此,您可以將早期版本的非阻塞服務器與下面顯示的客戶端一起使用。

public class AsyncClient {private void invoke() {try {ArithmeticService.AsyncClient client = new ArithmeticService.AsyncClient(new TBinaryProtocol.Factory(), new TAsyncClientManager(),new TNonblockingSocket("localhost", 7911));client.add(200, 400, new AddMethodCallback());client = new ArithmeticService.AsyncClient(new TBinaryProtocol.Factory(), new TAsyncClientManager(),new TNonblockingSocket("localhost", 7911));client.multiply(20, 50, new MultiplyMethodCallback());} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {AsyncClient c = new AsyncClient();c.invoke();}class AddMethodCallbackimplements AsyncMethodCallback<ArithmeticService.AsyncClient.add_call> {public void onComplete(ArithmeticService.AsyncClient.add_call add_call) {try {long result = add_call.getResult();System.out.println("Add from server: " + result);} catch (TException e) {e.printStackTrace();}}public void onError(Exception e) {System.out.println("Error : ");e.printStackTrace();}}class MultiplyMethodCallbackimplements AsyncMethodCallback<ArithmeticService.AsyncClient.multiply_call> {public void onComplete(ArithmeticService.AsyncClient.multiply_call multiply_call) {try {long result = multiply_call.getResult();System.out.println("Multiply from server: " + result);} catch (TException e) {e.printStackTrace();}}public void onError(Exception e) {System.out.println("Error : ");e.printStackTrace();}}}

已經定義了兩個回調,分別與服務的每個操作相對應。 請注意,這兩個調用使用了兩個客戶端實例。 每個調用都需要一個單獨的客戶端實例,否則客戶端將因以下異常而失敗

線程“ main ”中的異常java.lang.IllegalStateException:客戶端當前正在執行另一種方法:tutorial.arithmetic.gen.ArithmeticService $ AsyncClient $ add_call

因此,本文以不同的操作模式總結了我在Thrift上的快速入門。 希望有人會覺得有用。 如有任何建議或更正,請隨時發表評論。

[1] http://thrift.apache.org/static/thrift-20070401.pdf

參考:來自JCG合作伙伴的 Apache Thrift快速入門教程 ? Source Open博客中的Buddhika Chamith。


翻譯自: https://www.javacodegeeks.com/2012/03/apache-thrift-quickstart-tutorial.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373431.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數組拆分為新數組

package com.classes;//已知數組a&#xff0c;將奇數位置元素存到b數組中&#xff0c;偶數位置元素存到c數組中public class Shuzu1118_4 { public static void main(String[] args) { int [] a{3,6,9,1,4,7,2,5,8}; int [] b; //定義數組b int [] c; //定義數組c//先找出數組…

java數組交集_java數組的交集和并集

前兩天給我出了一道題&#xff0c;求數組的并集和交集&#xff0c;然后我試著寫一下&#xff0c;很尷尬&#xff0c;由于長時間沒有寫過代碼&#xff0c;一開始數組是如何定義的給忘了。當時我說了我的思路&#xff0c;不過也是很low的做法&#xff0c;查閱網上的一些資料&…

ADF聲明性組件示例

在我以前的文章中&#xff0c;我答應展示如何為智能值列表創建ADF聲明性組件。 因此&#xff0c;我將創建一個包含三個元素的組件&#xff1a;標簽&#xff0c;輸入文本和值的組合框列表。 那很容易。 我在工作空間中創建了一個單獨的ADF ViewController項目&#xff1a; 在此項…

VS2015 安裝包缺失(聯網安裝失敗)問題解決

Win7 x86 測試可行 * 如果前面有嘗試過安裝不成功, 一定要用卸載程序刪除已安裝的部分,否則會出亂子. 1. 或者是用虛擬光驅加載ISO, 或者是解壓到硬盤上, 都沒有關系. 2. 用管理員權限啟動CMD控制臺, 進入VS2015 安裝盤的根目錄 (vs_enterprise.exe 所在的目錄). 3. 執行命令 …

java藍橋暑假班_Java實現 藍橋杯VIP 算法提高 班級排名

算法提高 班級排名時間限制&#xff1a;1.0s 內存限制&#xff1a;256.0MB問題描述達達在陶陶的影響下&#xff0c;也對學習慢慢的產生了興趣。他在每次考試之后&#xff0c;都會追著老師問&#xff0c;自己在班級的總名次是多少。考試一多&#xff0c;老師也不耐煩了&#xff…

$.ajax所犯的錯誤。success后面不執行

$.ajax({ type: post, url: ../AshxHandler/HandlerAddPhoto.ashx, data: { clientPath: photoName }, dataType: text, cache: false, success: function (data) { alert(1); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(上傳圖片出現錯誤&#xf…

WhateverOrigin –與Heroku和Play對抗相同的原產地政策! 構架

不久前&#xff0c;我在編碼 Bitcoin Pie時發現需要克服臭名昭著的Same Origin Policy &#xff0c;該政策限制了運行在客戶端瀏覽器上的javascript可以訪問的域。 通過Stack Overflow&#xff0c;我找到了一個名為Any Origin的站點&#xff0c;這基本上是無需設置專用服務器即…

Solr集群更新配置的方式

solr集群中配置文件是經常更新的&#xff0c;頻率最高的也就是schema.xml和solrconfig.xml這兩個配置文件了&#xff0c;對于更新配置文件之前&#xff0c;我們先了解一下集群項目結構 由于在集群模式下&#xff0c;solrconfig.xml和schema.xml等配置文件都由Zookeeper集群管理…

java文本框雙擊可編輯_java swing 文本域雙擊變為可編輯

java swing如何實現文本域雙擊變為可編輯呢?給文本域添加鼠標事件監聽程序即可:resultTA1new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new MouseAdapter() {Overridep…

點擊出現黑色背景的解決

-webkit-tap-highlight-color:rgba(0,0,0,0);轉載于:https://www.cnblogs.com/luckyXcc/p/6085582.html

OSGi簡介–模塊化Java

OSGi聯盟是這一擱淺的管理機構&#xff0c;它始于1999年。其最初目標是為網絡設備創建開放擱淺。 基于此思想&#xff0c;此規范也針對Java引入。 Eclipse在Java中是第一個。 他們于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定義動態模塊的方法。 主要為Java實現…

HDU FatMouse's Speed 基本DP

題意&#xff1a;要求找到的體重遞增&#xff0c;速度遞減的老鼠&#xff0c;并且輸出最長的長度數&#xff0c;而且輸出各自的序列數。Special Judge 思路&#xff1a;先按體重由小到大排序&#xff0c;再找最長速度遞減序列。 轉移方程&#xff1a;mou[i].w>mou[j].w&am…

java xmpp openfire_搭建Xmpp服務器Openfire

step1、 安裝java環境這里是檢測是否安裝java的網頁如沒有安裝則進行以下步驟1、下載jdk7的mac版&#xff1a;jdk-7u79-macosx-x64.dmg2、安裝好之后&#xff0c;在命令行進入以下路徑查看#cd /Library/Java/JavaVirtualMachines/3、再查看你自己安裝的版本#ls版本為jdk-8u171-…

JavaFX移動應用程序最佳實踐,第1部分

到現在為止&#xff0c;所有對JavaFX感興趣的人都會知道&#xff0c;JavaFX Mobile發行了不久 前。 可以肯定的是&#xff0c;這真是令人難以置信。 我感到筋疲力盡&#xff0c;在發行期間我什至沒有精力去寫博客…… 但是到目前為止&#xff0c;我感到很恢復&#xff0c;并且希…

Spark程序運行報錯解決(1)

報錯內容&#xff1a;System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解決&#xff1a;Window——Preference——Java——Installed JREs——選中一個Jre 后 Edit 在Default VM arguments 里加入&#xff1a;-Xmx512M 轉載于:https://w…

java setsolinger_java socket 的參數選項解讀(轉)

在MulticastSocket的源代碼里有設置多播的方法&#xff1a;public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【轉】Linux終端下 dstat 監控工具

轉自https://linux.cn/article-3215-1.html dstat 是一個可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat這些命令的多功能產品。dstat克服了這些命令的局限并增加了一些另外的功能&#xff0c;增加了監控項&#xff0c;也變得更靈活了。dstat可以很方便監控系統…

Tomcat和IntelliJ –在webapps文件夾之外部署war文件

目前&#xff0c;我正在開發一個Android應用程序&#xff0c;該應用程序需要云中托管的大量REST服務來支持。 我基于對Java&#xff0c;Groovy以及最重要的Spring的支持選擇了Google App Engine 。 我開發了一個基于Spring MVC的REST應用程序&#xff0c;并使用ContentNegotiat…

[HDU1232] 暢通工程 (并查集 or 連通分量)

Input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數&#xff0c;分別是城鎮數目N ( < 1000 )和道路數目M&#xff1b;隨后的M行對應M條道路&#xff0c;每行給出一對正整數&#xff0c;分別是該條道路直接連通的兩個城鎮的編號。為簡單起見&#xff0c;城鎮…

java jdbc連接db2數據庫_Java連接db2數據庫(常用數據庫連接五)

1.安裝好db2數據庫&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并導入java連接db2所需要的jar包db2java.jar 下載地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代碼如下&#xff1a;package com.zh…