thrift-client 0.1.0 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/thrift_client.rb +6 -5
- data/lib/thrift_client/abstract_thrift_client.rb +106 -69
- data/lib/thrift_client/pool.rb +34 -0
- data/lib/thrift_client/pool/fiber_connection_pool.rb +67 -0
- data/lib/thrift_client/pool/thread_connection_pool.rb +69 -0
- data/lib/thrift_client/{abstract_server.rb → server.rb} +62 -60
- data/lib/thrift_client/thrift/client.rb +15 -0
- data/lib/thrift_client/thrift/processor.rb +44 -0
- data/lib/thrift_client/{thrift.rb → thrift/protocol.rb} +1 -72
- data/lib/thrift_client/thrift/struct.rb +15 -0
- data/lib/thrift_client/thrift/transport.rb +208 -0
- data/test/em_test.rb +1 -0
- data/test/foobar/bar_service.rb +133 -0
- data/test/foobar/common_service.rb +388 -0
- data/test/foobar/foo_service.rb +133 -0
- data/test/{foobar_constants.rb → foobar/foobar_constants.rb} +3 -3
- data/test/{foobar_types.rb → foobar/foobar_types.rb} +12 -10
- data/test/foobar/handler.rb +74 -0
- data/test/helper.rb +50 -0
- data/test/passport.rb +51 -0
- data/test/start_server.rb +8 -0
- data/test/test.rb +27 -0
- data/test/test_client.rb +111 -0
- data/test/test_config.rb +54 -0
- data/test/test_connection_pool.rb +43 -0
- data/test/test_eventmachine_transprot.rb +146 -0
- data/test/test_multiplexed.rb +62 -0
- metadata +47 -24
- data/lib/thrift_client/multi_client_server.rb +0 -59
- data/lib/thrift_client/single_client_server.rb +0 -37
- data/test/client_test.rb +0 -172
- data/test/foobar_service.rb +0 -282
- data/test/multiplexed_protocol_test.rb +0 -60
- data/test/multiplexed_server.rb +0 -102
- data/test/server.rb +0 -97
@@ -0,0 +1,133 @@
|
|
1
|
+
#
|
2
|
+
# Autogenerated by Thrift Compiler (0.9.1)
|
3
|
+
#
|
4
|
+
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'thrift'
|
8
|
+
require 'foobar/foobar_types'
|
9
|
+
|
10
|
+
module Test
|
11
|
+
module FooService
|
12
|
+
class Client
|
13
|
+
include ::Thrift::Client
|
14
|
+
|
15
|
+
def getFoo()
|
16
|
+
send_getFoo()
|
17
|
+
return recv_getFoo()
|
18
|
+
end
|
19
|
+
|
20
|
+
def send_getFoo()
|
21
|
+
send_message('getFoo', GetFoo_args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def recv_getFoo()
|
25
|
+
result = receive_message(GetFoo_result)
|
26
|
+
return result.success unless result.success.nil?
|
27
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'getFoo failed: unknown result')
|
28
|
+
end
|
29
|
+
|
30
|
+
def putFoo(foo)
|
31
|
+
send_putFoo(foo)
|
32
|
+
return recv_putFoo()
|
33
|
+
end
|
34
|
+
|
35
|
+
def send_putFoo(foo)
|
36
|
+
send_message('putFoo', PutFoo_args, :foo => foo)
|
37
|
+
end
|
38
|
+
|
39
|
+
def recv_putFoo()
|
40
|
+
result = receive_message(PutFoo_result)
|
41
|
+
return result.success unless result.success.nil?
|
42
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'putFoo failed: unknown result')
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class Processor
|
48
|
+
include ::Thrift::Processor
|
49
|
+
|
50
|
+
def process_getFoo(seqid, iprot, oprot)
|
51
|
+
args = read_args(iprot, GetFoo_args)
|
52
|
+
result = GetFoo_result.new()
|
53
|
+
result.success = @handler.getFoo()
|
54
|
+
write_result(result, oprot, 'getFoo', seqid)
|
55
|
+
end
|
56
|
+
|
57
|
+
def process_putFoo(seqid, iprot, oprot)
|
58
|
+
args = read_args(iprot, PutFoo_args)
|
59
|
+
result = PutFoo_result.new()
|
60
|
+
result.success = @handler.putFoo(args.foo)
|
61
|
+
write_result(result, oprot, 'putFoo', seqid)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
# HELPER FUNCTIONS AND STRUCTURES
|
67
|
+
|
68
|
+
class GetFoo_args
|
69
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
70
|
+
|
71
|
+
FIELDS = {
|
72
|
+
|
73
|
+
}
|
74
|
+
|
75
|
+
def struct_fields; FIELDS; end
|
76
|
+
|
77
|
+
def validate
|
78
|
+
end
|
79
|
+
|
80
|
+
::Thrift::Struct.generate_accessors self
|
81
|
+
end
|
82
|
+
|
83
|
+
class GetFoo_result
|
84
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
85
|
+
SUCCESS = 0
|
86
|
+
|
87
|
+
FIELDS = {
|
88
|
+
SUCCESS => {:type => ::Thrift::Types::STRUCT, :name => 'success', :class => ::Test::Foo}
|
89
|
+
}
|
90
|
+
|
91
|
+
def struct_fields; FIELDS; end
|
92
|
+
|
93
|
+
def validate
|
94
|
+
end
|
95
|
+
|
96
|
+
::Thrift::Struct.generate_accessors self
|
97
|
+
end
|
98
|
+
|
99
|
+
class PutFoo_args
|
100
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
101
|
+
FOO = 1
|
102
|
+
|
103
|
+
FIELDS = {
|
104
|
+
FOO => {:type => ::Thrift::Types::STRUCT, :name => 'foo', :class => ::Test::Foo}
|
105
|
+
}
|
106
|
+
|
107
|
+
def struct_fields; FIELDS; end
|
108
|
+
|
109
|
+
def validate
|
110
|
+
end
|
111
|
+
|
112
|
+
::Thrift::Struct.generate_accessors self
|
113
|
+
end
|
114
|
+
|
115
|
+
class PutFoo_result
|
116
|
+
include ::Thrift::Struct, ::Thrift::Struct_Union
|
117
|
+
SUCCESS = 0
|
118
|
+
|
119
|
+
FIELDS = {
|
120
|
+
SUCCESS => {:type => ::Thrift::Types::BOOL, :name => 'success'}
|
121
|
+
}
|
122
|
+
|
123
|
+
def struct_fields; FIELDS; end
|
124
|
+
|
125
|
+
def validate
|
126
|
+
end
|
127
|
+
|
128
|
+
::Thrift::Struct.generate_accessors self
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
#
|
2
|
-
# Autogenerated by Thrift Compiler (0.9.
|
2
|
+
# Autogenerated by Thrift Compiler (0.9.1)
|
3
3
|
#
|
4
4
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'thrift'
|
8
|
-
require 'foobar_types'
|
8
|
+
require 'foobar/foobar_types'
|
9
9
|
|
10
|
-
module
|
10
|
+
module Test
|
11
11
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
#
|
2
|
-
# Autogenerated by Thrift Compiler (0.9.
|
2
|
+
# Autogenerated by Thrift Compiler (0.9.1)
|
3
3
|
#
|
4
4
|
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'thrift'
|
8
8
|
|
9
|
-
module
|
9
|
+
module Test
|
10
10
|
class Foo
|
11
11
|
include ::Thrift::Struct, ::Thrift::Struct_Union
|
12
12
|
FIRST = 1
|
@@ -31,16 +31,18 @@ module Foo
|
|
31
31
|
|
32
32
|
class Bar
|
33
33
|
include ::Thrift::Struct, ::Thrift::Struct_Union
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
A = 1
|
35
|
+
B = 2
|
36
|
+
C = 3
|
37
|
+
D = 4
|
38
|
+
E = 5
|
38
39
|
|
39
40
|
FIELDS = {
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
A => {:type => ::Thrift::Types::STRING, :name => 'a'},
|
42
|
+
B => {:type => ::Thrift::Types::I32, :name => 'b'},
|
43
|
+
C => {:type => ::Thrift::Types::BOOL, :name => 'c'},
|
44
|
+
D => {:type => ::Thrift::Types::DOUBLE, :name => 'd'},
|
45
|
+
E => {:type => ::Thrift::Types::I64, :name => 'e'}
|
44
46
|
}
|
45
47
|
|
46
48
|
def struct_fields; FIELDS; end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Test
|
2
|
+
class FooHandler
|
3
|
+
def getFoo
|
4
|
+
foo = Test::Foo.new
|
5
|
+
foo.fourth = "222"
|
6
|
+
foo.third = 2.2
|
7
|
+
foo.second = 222222222222222
|
8
|
+
foo.first = 200000
|
9
|
+
return foo
|
10
|
+
end
|
11
|
+
|
12
|
+
def putFoo(foo)
|
13
|
+
puts foo.inspect
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class BarHandler
|
19
|
+
def getBar
|
20
|
+
bar = Test::Bar.new
|
21
|
+
bar.a = "1111111111"
|
22
|
+
bar.b = 11111111
|
23
|
+
bar.c = false
|
24
|
+
bar.d = 1111111.232323
|
25
|
+
bar.e = 111111111111111
|
26
|
+
return bar
|
27
|
+
end
|
28
|
+
|
29
|
+
def putBar(bar)
|
30
|
+
puts bar.inspect
|
31
|
+
return true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class CommonHandler
|
36
|
+
def ping
|
37
|
+
puts "ping"
|
38
|
+
end
|
39
|
+
|
40
|
+
def wait(seconds)
|
41
|
+
sleep(seconds / 100.0)
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
|
45
|
+
def timeout
|
46
|
+
sleep(200000)
|
47
|
+
return false
|
48
|
+
end
|
49
|
+
|
50
|
+
def apperror()
|
51
|
+
puts "error"
|
52
|
+
return Thrift::ApplicationException.new("apperr")
|
53
|
+
end
|
54
|
+
|
55
|
+
def ptoerror()
|
56
|
+
puts "error"
|
57
|
+
raise Thrift::ProtocolException.new("ptoerror")
|
58
|
+
return true
|
59
|
+
end
|
60
|
+
|
61
|
+
def tranerror()
|
62
|
+
puts "error"
|
63
|
+
raise Thrift::TransportException.new("tranerror")
|
64
|
+
return true
|
65
|
+
end
|
66
|
+
|
67
|
+
def ioerror()
|
68
|
+
puts "error"
|
69
|
+
raise IOError.new("ioerror")
|
70
|
+
return true
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
$:.unshift File.expand_path("../../lib", __FILE__)
|
2
|
+
$:.unshift File.expand_path("../../test", __FILE__)
|
3
|
+
|
4
|
+
require "thrift_client"
|
5
|
+
require 'thrift'
|
6
|
+
require 'foobar/common_service'
|
7
|
+
require 'foobar/foo_service'
|
8
|
+
require 'foobar/bar_service'
|
9
|
+
require 'foobar/handler'
|
10
|
+
|
11
|
+
module Test
|
12
|
+
module Helper
|
13
|
+
include Thrift
|
14
|
+
|
15
|
+
def self.start_server(host = "127.0.0.1", port = 9000)
|
16
|
+
common_handler = Test::CommonHandler.new
|
17
|
+
common_processor = Test::CommonService::Processor.new(common_handler)
|
18
|
+
foo_handler = Test::FooHandler.new
|
19
|
+
foo_processor = Test::FooService::Processor.new(foo_handler)
|
20
|
+
bar_handler = Test::BarHandler.new
|
21
|
+
bar_processor = Test::BarService::Processor.new(bar_handler)
|
22
|
+
processor = Thrift::MultiplexedProcessor.new
|
23
|
+
processor.register(common_processor.class.name.split("::")[-2].downcase.gsub("service",""), common_processor)
|
24
|
+
processor.register(foo_processor.class.name.split("::")[-2].downcase.gsub("service",""), foo_processor)
|
25
|
+
processor.register(bar_processor.class.name.split("::")[-2].downcase.gsub("service",""), bar_processor)
|
26
|
+
transport = Thrift::ServerSocket.new(host, port)
|
27
|
+
transport_factory = Thrift::FramedTransportFactory.new
|
28
|
+
protocol_factory = Thrift::CompactProtocolFactory.new
|
29
|
+
args = [processor, transport, transport_factory, protocol_factory]
|
30
|
+
server = Thrift::NonblockingServer.new(*args)
|
31
|
+
@server = server
|
32
|
+
sleep(1)
|
33
|
+
@server_thread = Thread.new do
|
34
|
+
@server.serve
|
35
|
+
end
|
36
|
+
sleep(1)
|
37
|
+
puts "server start listen on #{host}:#{port}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.shutdown_server
|
41
|
+
return if @server.nil?
|
42
|
+
if @server.respond_to? :shutdown
|
43
|
+
@server.shutdown
|
44
|
+
else
|
45
|
+
@server_thread.kill
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/test/passport.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
$:.unshift File.expand_path("../../lib", __FILE__)
|
2
|
+
$:.unshift File.expand_path("../../test", __FILE__)
|
3
|
+
|
4
|
+
require "test/unit"
|
5
|
+
require 'thrift'
|
6
|
+
require "thrift_client"
|
7
|
+
require "passport_thrift_client"
|
8
|
+
require "em-synchrony"
|
9
|
+
require 'em-synchrony/fiber_iterator'
|
10
|
+
|
11
|
+
class ProfileTest < Test::Unit::TestCase
|
12
|
+
include Test::Unit::Assertions
|
13
|
+
def setup
|
14
|
+
super
|
15
|
+
puts "setup"
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_profile
|
19
|
+
EM.synchrony do
|
20
|
+
client = ThriftClient.new({"multiplexed" => true, "timeout" => 10, "transport" => "eventmachine","size" => 100,"client_class" => "Passport::Thrift::RemoteUserProfileService::Client","servers" => "vm173:9100"})
|
21
|
+
# client.queryUserBasicInfo(3033)
|
22
|
+
start = Time.now
|
23
|
+
EM::Synchrony::FiberIterator.new(0...2000, 1000).each do |i|
|
24
|
+
client.queryUserBasicInfo(3033)
|
25
|
+
end
|
26
|
+
stop = Time.now
|
27
|
+
em_use = stop - start
|
28
|
+
puts em_use
|
29
|
+
client.destroy
|
30
|
+
EM.stop
|
31
|
+
end
|
32
|
+
|
33
|
+
# client = ThriftClient.new({"multiplexed" => true, "timeout" => 10, "transport" => "socket","size"=>1,"client_class" => "Passport::Thrift::RemoteUserProfileService::Client","servers" => "vm173:9100"})
|
34
|
+
# i = 0
|
35
|
+
# client.queryUserBasicInfo(3033)
|
36
|
+
# start = Time.now
|
37
|
+
# while i < 10000
|
38
|
+
# client.queryUserBasicInfo(3033)
|
39
|
+
# i+=1
|
40
|
+
# end
|
41
|
+
# stop = Time.now
|
42
|
+
# em_use = stop - start
|
43
|
+
# puts em_use
|
44
|
+
# client.destroy
|
45
|
+
end
|
46
|
+
|
47
|
+
def teardown
|
48
|
+
super
|
49
|
+
puts "teardown"
|
50
|
+
end
|
51
|
+
end
|
data/test/test.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
class RetryTest
|
2
|
+
def test
|
3
|
+
puts "method begin"
|
4
|
+
try = 0
|
5
|
+
begin
|
6
|
+
puts "try begin"
|
7
|
+
raise "error"
|
8
|
+
rescue Exception => e
|
9
|
+
puts "Exception"
|
10
|
+
if try < 1
|
11
|
+
try += 1
|
12
|
+
retry
|
13
|
+
end
|
14
|
+
puts "after retry"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
RetryTest.new.test
|
20
|
+
|
21
|
+
object = 2
|
22
|
+
case object
|
23
|
+
when 2
|
24
|
+
puts object
|
25
|
+
when 3
|
26
|
+
puts object
|
27
|
+
end
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
$:.unshift File.expand_path("../../lib", __FILE__)
|
2
|
+
# $:.unshift File.expand_path("../../test", __FILE__)
|
3
|
+
|
4
|
+
require "test/unit"
|
5
|
+
require "thrift_client"
|
6
|
+
require "yaml"
|
7
|
+
require "feed"
|
8
|
+
require 'em-synchrony'
|
9
|
+
require 'em-synchrony/fiber_iterator'
|
10
|
+
require 'stat-analysis-query'
|
11
|
+
|
12
|
+
class ClientTest < Test::Unit::TestCase
|
13
|
+
include Test::Unit::Assertions
|
14
|
+
def setup
|
15
|
+
super
|
16
|
+
root = File.expand_path("../..", __FILE__)
|
17
|
+
@config = YAML.load_file(File.join(root, 'test/thrift_config.yaml'))
|
18
|
+
puts "setup"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_thread_client
|
22
|
+
client = ThriftClient.new(@config['client_feed'])
|
23
|
+
while 1
|
24
|
+
Thread.new {
|
25
|
+
client.getWebUnread('3428')
|
26
|
+
}
|
27
|
+
sleep(0.01)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_fiber_client
|
32
|
+
EM.synchrony do
|
33
|
+
client = ThriftClient.new(@config['client_em_feed'])
|
34
|
+
start = Time.now
|
35
|
+
number = 0
|
36
|
+
while number < 10
|
37
|
+
EM::Synchrony::FiberIterator.new(0...5, 5).each do |i|
|
38
|
+
client.getWebSoundRange('12', 0, 100)
|
39
|
+
puts i
|
40
|
+
end
|
41
|
+
number += 1
|
42
|
+
end
|
43
|
+
stop = Time.now
|
44
|
+
em_use = stop - start
|
45
|
+
EM.stop
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_thread_return_nil
|
50
|
+
client = ThriftClient.new(@config['client_query'])
|
51
|
+
sleep(3)
|
52
|
+
begin
|
53
|
+
p client.selectWebHumanCategory
|
54
|
+
rescue Exception => e
|
55
|
+
backtrace = ""
|
56
|
+
e.backtrace.each { | s |
|
57
|
+
backtrace.concat(s).concat("\n")
|
58
|
+
}
|
59
|
+
# puts "#{e} #{e.backtrace}"
|
60
|
+
puts "#{e.class} #{e.message} #{backtrace}"
|
61
|
+
end
|
62
|
+
sleep(1)
|
63
|
+
begin
|
64
|
+
p client.selectWebAlbumCategoryAndTag
|
65
|
+
rescue Exception => e
|
66
|
+
puts "#{e} #{e.backtrace}"
|
67
|
+
end
|
68
|
+
begin
|
69
|
+
p client.selectWebAlbumCategoryAndTag
|
70
|
+
rescue Exception => e
|
71
|
+
puts "#{e} #{e.backtrace}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_fiber_return_nil
|
76
|
+
EM.synchrony do
|
77
|
+
client = ThriftClient.new(@config['client_em_query'])
|
78
|
+
start = Time.now
|
79
|
+
EM::Synchrony::FiberIterator.new(0...1, 1).each do |i|
|
80
|
+
begin
|
81
|
+
p client.selectWebHumanCategory
|
82
|
+
rescue Exception => e
|
83
|
+
puts "#{e.class} #{e.message} #{e.backtrace}"
|
84
|
+
end
|
85
|
+
sleep(1)
|
86
|
+
begin
|
87
|
+
p client.selectWebAlbumCategoryAndTag
|
88
|
+
rescue Exception => e
|
89
|
+
backtrace = ""
|
90
|
+
e.backtrace.each { | s |
|
91
|
+
backtrace.concat(s).concat("\n")
|
92
|
+
}
|
93
|
+
puts "#{e} #{e.backtrace}"
|
94
|
+
end
|
95
|
+
begin
|
96
|
+
p client.selectWebAlbumCategoryAndTag
|
97
|
+
rescue Exception => e
|
98
|
+
puts "#{e} #{backtrace}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
stop = Time.now
|
102
|
+
em_use = stop - start
|
103
|
+
EM.stop
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def teardown
|
108
|
+
super
|
109
|
+
puts "teardown"
|
110
|
+
end
|
111
|
+
end
|