qrpc 0.4.0 → 0.9.0
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.
- data/CHANGES.txt +9 -6
- data/Gemfile +10 -4
- data/Gemfile.lock +34 -12
- data/LICENSE.txt +1 -1
- data/README.md +92 -25
- data/Rakefile +2 -1
- data/TODO.md +1 -3
- data/VERSION +1 -1
- data/lib/qrpc/client.rb +13 -5
- data/lib/qrpc/client/dispatcher.rb +66 -50
- data/lib/qrpc/client/exception.rb +8 -37
- data/lib/qrpc/client/job.rb +49 -16
- data/lib/qrpc/general.rb +61 -1
- data/lib/qrpc/generator/object-id.rb +43 -0
- data/lib/qrpc/generator/uuid.rb +43 -0
- data/lib/qrpc/locator.rb +11 -85
- data/lib/qrpc/locator/em-jack.rb +160 -0
- data/lib/qrpc/locator/evented-queue.rb +101 -0
- data/lib/qrpc/protocol/abstract.rb +119 -0
- data/lib/qrpc/protocol/abstract/error.rb +54 -0
- data/lib/qrpc/protocol/abstract/object.rb +81 -0
- data/lib/qrpc/protocol/abstract/request.rb +126 -0
- data/lib/qrpc/protocol/abstract/response.rb +103 -0
- data/lib/qrpc/protocol/json-rpc.rb +32 -0
- data/lib/qrpc/protocol/json-rpc/error.rb +71 -0
- data/lib/qrpc/protocol/json-rpc/native/exception-data.rb +247 -0
- data/lib/qrpc/protocol/json-rpc/native/qrpc-object.rb +137 -0
- data/lib/qrpc/protocol/json-rpc/request.rb +140 -0
- data/lib/qrpc/protocol/json-rpc/response.rb +146 -0
- data/lib/qrpc/protocol/object.rb +32 -0
- data/lib/qrpc/protocol/object/error.rb +46 -0
- data/lib/qrpc/protocol/object/request.rb +111 -0
- data/lib/qrpc/protocol/object/response.rb +93 -0
- data/lib/qrpc/server.rb +63 -48
- data/lib/qrpc/server/dispatcher.rb +5 -107
- data/lib/qrpc/server/job.rb +69 -19
- data/qrpc.gemspec +55 -19
- data/test-both.rb +85 -0
- data/test-client.rb +36 -8
- data/test-server.rb +17 -12
- metadata +181 -31
- data/lib/qrpc/protocol/exception-data.rb +0 -227
- data/lib/qrpc/protocol/qrpc-object.rb +0 -103
- data/lib/qrpc/protocol/request.rb +0 -46
@@ -0,0 +1,160 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# (c) 2011 Martin Kozák (martinkozak@martinkozak.net)
|
3
|
+
|
4
|
+
require "hash-utils/array"
|
5
|
+
require "unified-queues"
|
6
|
+
require "em-jack"
|
7
|
+
|
8
|
+
##
|
9
|
+
# General QRPC module.
|
10
|
+
#
|
11
|
+
|
12
|
+
module QRPC
|
13
|
+
|
14
|
+
##
|
15
|
+
# Resource locators.
|
16
|
+
#
|
17
|
+
|
18
|
+
module Locator
|
19
|
+
|
20
|
+
##
|
21
|
+
# Locator for 'em-jack' (so EventMachine Beanstalk implementation)
|
22
|
+
# queue type.
|
23
|
+
#
|
24
|
+
# @see https://github.com/dj2/em-jack
|
25
|
+
# @since 0.9.0
|
26
|
+
#
|
27
|
+
|
28
|
+
class EMJackLocator
|
29
|
+
|
30
|
+
##
|
31
|
+
# Holds the input queue interface.
|
32
|
+
# @return [UnifiedQueues::Multi] input queue
|
33
|
+
#
|
34
|
+
|
35
|
+
@input_queue
|
36
|
+
|
37
|
+
##
|
38
|
+
# Holds the input queue interface.
|
39
|
+
# @return [UnifiedQueues::Multi] output queue
|
40
|
+
#
|
41
|
+
|
42
|
+
@output_queue
|
43
|
+
|
44
|
+
##
|
45
|
+
# Contains queue name.
|
46
|
+
# @return [String]
|
47
|
+
#
|
48
|
+
|
49
|
+
attr_accessor :queue_name
|
50
|
+
@queue_name
|
51
|
+
|
52
|
+
##
|
53
|
+
# Contains host.
|
54
|
+
# @return [String]
|
55
|
+
#
|
56
|
+
|
57
|
+
attr_accessor :host
|
58
|
+
@host
|
59
|
+
|
60
|
+
##
|
61
|
+
# Contains port.
|
62
|
+
# @return [Integer]
|
63
|
+
#
|
64
|
+
|
65
|
+
attr_accessor :port
|
66
|
+
@port
|
67
|
+
|
68
|
+
##
|
69
|
+
# Parser.
|
70
|
+
#
|
71
|
+
|
72
|
+
PARSER = /^(.+)@(.+)(?:\:(\d+))?$/
|
73
|
+
|
74
|
+
##
|
75
|
+
# Default port.
|
76
|
+
#
|
77
|
+
|
78
|
+
DEFAULT_PORT = 11300
|
79
|
+
|
80
|
+
##
|
81
|
+
# Constructor.
|
82
|
+
#
|
83
|
+
# @param [String, Symbol] queue_name queue name
|
84
|
+
# @param [String] host host name
|
85
|
+
# @param [Integer] port port of the host
|
86
|
+
#
|
87
|
+
|
88
|
+
def initialize(queue_name, host = "localhost", port = 11300)
|
89
|
+
@queue_name = queue_name.to_s
|
90
|
+
@host = host
|
91
|
+
@port = port
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Parses the locator.
|
96
|
+
# Excpects form +<queue>@<host>:<port>+. Port is optional.
|
97
|
+
#
|
98
|
+
# @param [String] string locator in string form
|
99
|
+
# @return [QRPC::Locator] new instance
|
100
|
+
#
|
101
|
+
|
102
|
+
def self.parse(string)
|
103
|
+
match = string.match(self::PARSER)
|
104
|
+
|
105
|
+
queue = match.first
|
106
|
+
host = match.second
|
107
|
+
|
108
|
+
if match.length == 3
|
109
|
+
port = match.third
|
110
|
+
else
|
111
|
+
port = self::DEFAULT_PORT
|
112
|
+
end
|
113
|
+
|
114
|
+
port = port.to_i
|
115
|
+
|
116
|
+
##
|
117
|
+
|
118
|
+
return self::new(queue, host, port);
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# Converts back to string.
|
123
|
+
# @return [String] locator in string form
|
124
|
+
#
|
125
|
+
|
126
|
+
def to_s
|
127
|
+
@queue_name + "@" + @host + ":" + @port.to_s
|
128
|
+
end
|
129
|
+
|
130
|
+
##
|
131
|
+
# Returns universal queue interface for input queue.
|
132
|
+
# @return [UnifiedQueues::Multi] queue
|
133
|
+
#
|
134
|
+
|
135
|
+
def input_queue
|
136
|
+
if @input_queue.nil?
|
137
|
+
@input_queue = UnifiedQueues::Multi::new EMJack::Connection, :host => @host, :port => @port
|
138
|
+
else
|
139
|
+
@input_queue
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
##
|
144
|
+
# Returns universal queue interface for output queue.
|
145
|
+
# @return [UnifiedQueues::Multi] queue
|
146
|
+
#
|
147
|
+
|
148
|
+
def output_queue
|
149
|
+
if @output_queue.nil?
|
150
|
+
@output_queue = UnifiedQueues::Multi::new EMJack::Connection, :host => @host, :port => @port
|
151
|
+
else
|
152
|
+
@output_queue
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# (c) 2011 Martin Kozák (martinkozak@martinkozak.net)
|
3
|
+
|
4
|
+
require "priority_queue/c_priority_queue"
|
5
|
+
require "hash-utils/array"
|
6
|
+
require "unified-queues"
|
7
|
+
require "evented-queue"
|
8
|
+
require "em-wrapper"
|
9
|
+
|
10
|
+
##
|
11
|
+
# General QRPC module.
|
12
|
+
#
|
13
|
+
|
14
|
+
module QRPC
|
15
|
+
|
16
|
+
##
|
17
|
+
# Resource locators.
|
18
|
+
#
|
19
|
+
|
20
|
+
module Locator
|
21
|
+
|
22
|
+
##
|
23
|
+
# Locator for 'evented-queue' queue type.
|
24
|
+
#
|
25
|
+
# @see https://github.com/martinkozak/evented-queue
|
26
|
+
# @since 0.9.0
|
27
|
+
#
|
28
|
+
|
29
|
+
class EventedQueueLocator
|
30
|
+
|
31
|
+
##
|
32
|
+
# Contains queue name.
|
33
|
+
# @return [String]
|
34
|
+
#
|
35
|
+
|
36
|
+
attr_accessor :queue_name
|
37
|
+
@queue_name
|
38
|
+
|
39
|
+
##
|
40
|
+
# Contains queue instance.
|
41
|
+
# @return [EventedQueue::Recurring]
|
42
|
+
#
|
43
|
+
|
44
|
+
attr_accessor :queue
|
45
|
+
@queue
|
46
|
+
|
47
|
+
##
|
48
|
+
# Constructor.
|
49
|
+
# @param [EventedQueue::Recurring] queue recurring evented queue instance
|
50
|
+
#
|
51
|
+
|
52
|
+
def initialize(queue_name, queue = self.default_queue)
|
53
|
+
@queue = queue
|
54
|
+
@queue_name = queue_name
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Returns the default evented queue type.
|
59
|
+
#
|
60
|
+
|
61
|
+
def default_queue
|
62
|
+
UnifiedQueues::Multi::new UnifiedQueues::Single, ::EM::Wrapper::new(REUQ), UnifiedQueues::Single, CPriorityQueue
|
63
|
+
end
|
64
|
+
|
65
|
+
alias :input_queue :queue
|
66
|
+
alias :output_queue :queue
|
67
|
+
|
68
|
+
|
69
|
+
##
|
70
|
+
# Helper recurring evented queue with unified queues support.
|
71
|
+
# @since 0.9.0
|
72
|
+
#
|
73
|
+
|
74
|
+
class REUQ < ::EventedQueue::Recurring
|
75
|
+
|
76
|
+
##
|
77
|
+
# Constructor.
|
78
|
+
#
|
79
|
+
|
80
|
+
def initialize(*args)
|
81
|
+
cls = args.first
|
82
|
+
args.shift
|
83
|
+
object = cls::new(*args)
|
84
|
+
super(object)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
=begin
|
92
|
+
q = QRPC::Locator::EventedQueue::new
|
93
|
+
q.input_queue.use(:xyz)
|
94
|
+
q.queue.push(:x, 2)
|
95
|
+
q.queue.push(:y, 3)
|
96
|
+
q.queue.subscribe(:xyz)
|
97
|
+
q.queue.pop do |i|
|
98
|
+
p i
|
99
|
+
end
|
100
|
+
q.queue.push(:z, 1)
|
101
|
+
=end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# (c) 2011 Martin Kozák (martinkozak@martinkozak.net)
|
3
|
+
|
4
|
+
require "hash-utils/object"
|
5
|
+
require "hash-utils/module"
|
6
|
+
require "qrpc/general"
|
7
|
+
require "hashie/mash"
|
8
|
+
require "abstract"
|
9
|
+
|
10
|
+
##
|
11
|
+
# General QRPC module.
|
12
|
+
#
|
13
|
+
|
14
|
+
module QRPC
|
15
|
+
|
16
|
+
##
|
17
|
+
# Protocols helper module.
|
18
|
+
# @since 0.9.0
|
19
|
+
#
|
20
|
+
|
21
|
+
module Protocol
|
22
|
+
|
23
|
+
##
|
24
|
+
# Abstract protocol implementation.
|
25
|
+
#
|
26
|
+
# @since 0.9.0
|
27
|
+
# @abstract
|
28
|
+
#
|
29
|
+
|
30
|
+
class Abstract
|
31
|
+
|
32
|
+
##
|
33
|
+
# Holds general object options.
|
34
|
+
# @return [Hashie::Mash] general options
|
35
|
+
#
|
36
|
+
|
37
|
+
attr_accessor :options
|
38
|
+
@options
|
39
|
+
|
40
|
+
##
|
41
|
+
# Holds classes to modules assignment cache.
|
42
|
+
#
|
43
|
+
|
44
|
+
@module_cache
|
45
|
+
|
46
|
+
##
|
47
|
+
# Constructor.
|
48
|
+
#
|
49
|
+
# @param [Hash] options general options for submodules
|
50
|
+
# @abstract
|
51
|
+
#
|
52
|
+
|
53
|
+
def initialize(options = { })
|
54
|
+
@options = Hashie::Mash::new(options)
|
55
|
+
@module_cache = { }
|
56
|
+
|
57
|
+
if self.instance_of? Abstract
|
58
|
+
not_implemented
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Returns new request object.
|
64
|
+
# @return [Class] class of the request object
|
65
|
+
#
|
66
|
+
|
67
|
+
def request
|
68
|
+
__module(:Request)
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Returns new response object.
|
73
|
+
# @return [Class] class of the response object
|
74
|
+
#
|
75
|
+
|
76
|
+
def response
|
77
|
+
__module(:Response)
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Returns new error object.
|
82
|
+
# @return [Class] class of the error object
|
83
|
+
#
|
84
|
+
|
85
|
+
def error
|
86
|
+
__module(:Error)
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
##
|
93
|
+
# Returns class from module according to specific driver
|
94
|
+
def __module(name)
|
95
|
+
mod = Module.get_module(self.class.name + "::" + name.to_s)
|
96
|
+
|
97
|
+
if not mod.in? @module_cache
|
98
|
+
cls = Class::new(mod)
|
99
|
+
opt = @options
|
100
|
+
|
101
|
+
cls.class_eval do
|
102
|
+
define_method :initialize do |options = { }, &block|
|
103
|
+
super(opt.merge(options), &block)
|
104
|
+
end
|
105
|
+
|
106
|
+
define_singleton_method :options do
|
107
|
+
opt
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
@module_cache[mod] = cls
|
112
|
+
end
|
113
|
+
|
114
|
+
@module_cache[mod]
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# (c) 2011 Martin Kozák (martinkozak@martinkozak.net)
|
3
|
+
|
4
|
+
require "abstract"
|
5
|
+
require "qrpc/general"
|
6
|
+
require "qrpc/protocol/abstract/object"
|
7
|
+
|
8
|
+
##
|
9
|
+
# General QRPC module.
|
10
|
+
#
|
11
|
+
|
12
|
+
module QRPC
|
13
|
+
|
14
|
+
##
|
15
|
+
# Protocols helper module.
|
16
|
+
# @since 0.9.0
|
17
|
+
#-
|
18
|
+
|
19
|
+
module Protocol
|
20
|
+
|
21
|
+
##
|
22
|
+
# Abstract protocol implementation.
|
23
|
+
# @since 0.9.0
|
24
|
+
#
|
25
|
+
|
26
|
+
class Abstract
|
27
|
+
|
28
|
+
##
|
29
|
+
# Abstract error object implementation.
|
30
|
+
#
|
31
|
+
# @since 0.9.0
|
32
|
+
# @abstract
|
33
|
+
#
|
34
|
+
|
35
|
+
class Error < Object
|
36
|
+
|
37
|
+
##
|
38
|
+
# Constructor.
|
39
|
+
#
|
40
|
+
# @param [Hash] init initial options
|
41
|
+
# @abstract
|
42
|
+
#
|
43
|
+
|
44
|
+
def initialize(init = { })
|
45
|
+
super(init)
|
46
|
+
if self.instance_of? Error
|
47
|
+
not_implemented
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# (c) 2011 Martin Kozák (martinkozak@martinkozak.net)
|
3
|
+
|
4
|
+
require "abstract"
|
5
|
+
require "hashie/mash"
|
6
|
+
require "qrpc/general"
|
7
|
+
require "qrpc/protocol/abstract"
|
8
|
+
|
9
|
+
##
|
10
|
+
# General QRPC module.
|
11
|
+
#
|
12
|
+
|
13
|
+
module QRPC
|
14
|
+
|
15
|
+
##
|
16
|
+
# Protocols helper module.
|
17
|
+
# @since 0.9.0
|
18
|
+
#
|
19
|
+
|
20
|
+
module Protocol
|
21
|
+
|
22
|
+
##
|
23
|
+
# Abstract protocol implementation.
|
24
|
+
# @since 0.9.0
|
25
|
+
#
|
26
|
+
|
27
|
+
class Abstract
|
28
|
+
|
29
|
+
##
|
30
|
+
# Abstract request implementation.
|
31
|
+
# @sice 0.9.0
|
32
|
+
#
|
33
|
+
|
34
|
+
class Object
|
35
|
+
|
36
|
+
##
|
37
|
+
# Holds the object options.
|
38
|
+
# @return [Hashie::Mash] options hash
|
39
|
+
#
|
40
|
+
|
41
|
+
attr_accessor :options
|
42
|
+
@options
|
43
|
+
|
44
|
+
##
|
45
|
+
# Constructor.
|
46
|
+
#
|
47
|
+
# @param [Hash] init initial options
|
48
|
+
# @abstract
|
49
|
+
#
|
50
|
+
|
51
|
+
def initialize(init = { })
|
52
|
+
@options = Hashie::Mash::new(init)
|
53
|
+
if self.instance_of? Object
|
54
|
+
not_implemented
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Assigns options to the object.
|
60
|
+
# @param [Hash] options hash with options
|
61
|
+
#
|
62
|
+
|
63
|
+
def assign_options(options = { })
|
64
|
+
@options = @options.merge(options)
|
65
|
+
end
|
66
|
+
|
67
|
+
##
|
68
|
+
# Serializes object to the resultant form.
|
69
|
+
#
|
70
|
+
# @return [String] serialized form
|
71
|
+
# @abstract
|
72
|
+
#
|
73
|
+
|
74
|
+
def serialize
|
75
|
+
not_implemented
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|