溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

學(xué)習(xí)札記———thrift在RubyOnRails工程實(shí)踐實(shí)錄

發(fā)布時(shí)間:2020-07-21 15:18:35 來源:網(wǎng)絡(luò) 閱讀:372 作者:JackSongBlack 欄目:編程語(yǔ)言
關(guān)于thrift 使用雖然語(yǔ)法簡(jiǎn)單但是在實(shí)踐中還是出了一些問題,主要問題存在于我對(duì)ruby語(yǔ)法的不了解,下面就是我的實(shí)踐實(shí)錄
../xml.thrift
\**
*namespace 是命令空間 但是關(guān)于ruby的空間視乎還是有些問題
**\
namespace ruby XmlThrift
namespace java com.shsz.young.thrift.proto
\**
* 類型結(jié)構(gòu)體
**\
struct Xmltype{
1:string xml
}
\**
*意外處理數(shù)據(jù)結(jié)構(gòu)體
**\
exception InvalidOperation {
    1: string errors
}
\**
*提供服務(wù)
**\
service XmlResponce{

string input(1:string xml)throws(1: InvalidOperation errors), \*throws 是指發(fā)生意外返回的情況
string output(1:string xml)throws(1: InvalidOperation errors),

oneway void push() \* oneway 是指單邊處理

}
然后執(zhí)行
thrift -r --gen rb xml.thrift
生成文件應(yīng)該由一下三個(gè)

xml_constants.rb
xml_responce.rb
xml_types.rb

我主要卡殼在文件載入這個(gè)上面,經(jīng)過google幾番查找后終于尋得法子使用絕對(duì)路徑,才能應(yīng)付,腳本生成的代碼在RubyOnRails工程中還需要修改下 ,主要是引用文件路徑上。原教程在$..push('../ruby_gen')但是在工程中有各種問題,絕對(duì)路徑代碼如下

require File.expand_path('../../../gen-rb/xml_types', __FILE__)   

__FILE__ 這句話代表文件在工程的絕對(duì)路徑

2.ruby端server實(shí)踐代碼

#encoding:utf-8
require 'thrift'
require File.expand_path('../../../gen-rb/xml_types', __FILE__)    \
require File.expand_path('../../../gen-rb/xml_responce', __FILE__)

class XmlServerHandler
    def initialize

    end

    def input(xml)
        puts xml
        'xml'
    end

    def output(xml)
     puts xml
        xml
    end

    def push()
        print "服務(wù)器已啟動(dòng)"
    end
end

def new_server
    handler = XmlServerHandler.new
    processor = XmlResponce::Processor.new(handler)
    transport = Thrift::ServerSocket.new(9090)
    transportFactory = Thrift::BufferedTransportFactory.new()
    server = Thrift::SimpleServer.new(processor, transport, transportFactory)

    puts "Starting the    server..."

    server.serve()
    puts "done."
end

3. ruby端client實(shí)踐
#encoding:utf-8


require 'thrift'
require File.expand_path('../../../gen-rb/xml_types', __FILE__)
require File.expand_path('../../../gen-rb/xml_responce', __FILE__)


begin

    transport = Thrift::BufferedTransport.new(Thrift::Socket.new('localhost', 9090))
    protocol = Thrift::BinaryProtocol.new(transport)
    client = XmlResponce::Client.new(protocol)

    transport.open()


    # Run a remote calculation
    puts client.input('xml')    #it accessing the ruby server program method calc via thrift service

    puts client.output('xml')
    #Run a Async call
    client.push()

    transport.close()
rescue
    puts $!
end
這里比較突出的是begin  rescue end 語(yǔ)法,他的意思是 首先執(zhí)行begin 包裹的代碼,如果出現(xiàn)意外則執(zhí)行rescue包裹的代碼


另外 初次接觸了ruby多線程編程

簡(jiǎn)單開辟新線程的方式是

thread =Thread.New() 括號(hào)里可包裹你要執(zhí)行的方法
但是只是這樣還是不行的,在ruby中,當(dāng)主線程執(zhí)行完后,會(huì)殺死所有子線程所有還需要用jion這個(gè)關(guān)鍵字來讓主線程等待子線程執(zhí)行完
 
thread .jion

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI