关于thrift 使用虽然语法简单但是在实践中还是出了一些问题,主要问题存在于我对ruby语法的不了解,下面就是我的实践实录
../xml.thrift
\**
*namespace 是命令空间 但是关于ruby的空间视乎还是有些问题
**\
namespace ruby XmlThrift
namespace java com.shsz.young.thrift.proto
\**
* 类型结构体
**\
struct Xmltype{
1:string xml
}
\**
*意外处理数据结构体
**\
exception InvalidOperation {
1: string errors
}
\**
*提供服务
**\
service XmlResponce{
string input(1:string xml)throws(1: InvalidOperation errors), \*throws 是指发生意外返回的情况
string output(1:string xml)throws(1: InvalidOperation errors),
oneway void push() \* oneway 是指单边处理
}
然后执行
thrift -r --gen rb xml.thrift
生成文件应该由一下三个
xml_constants.rb
xml_responce.rb
xml_types.rb
我主要卡壳在文件载入这个上面,经过google几番查找后终于寻得法子使用绝对路径,才能应付,脚本生成的代码在RubyOnRails工程中还需要修改下 ,主要是引用文件路径上。原教程在$..push('../ruby_gen')但是在工程中有各种问题,绝对路径代码如下
require File.expand_path('../../../gen-rb/xml_types', __FILE__)
__FILE__ 这句话代表文件在工程的绝对路径
2.ruby端server实践代码
#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 "
服务器已启动"
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实践
#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 语法,他的意思是 首先执行begin 包裹的代码,如果出现意外则执行rescue包裹的代码
另外 初次接触了ruby多线程编程
简单开辟新线程的方式是
thread =Thread.New() 括号里可包裹你要执行的方法
但是只是这样还是不行的,在ruby中,当主线程执行完后,会杀死所有子线程所有还需要用jion这个关键字来让主线程等待子线程执行完
thread .jion
网站栏目:学习札记———thrift在RubyOnRails工程实践实录
当前网址:
http://www.cdkjz.cn/article/gsogic.html