em-synchrony 1.0.1 → 1.0.2
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/README.md +173 -173
- data/em-synchrony.gemspec +1 -1
- data/lib/active_record/connection_adapters/em_mysql2_adapter.rb +47 -47
- data/lib/em-synchrony.rb +1 -1
- data/lib/em-synchrony/activerecord.rb +102 -102
- data/lib/em-synchrony/amqp.rb +180 -180
- data/lib/em-synchrony/em-hiredis.rb +103 -103
- data/lib/em-synchrony/tcpsocket.rb +157 -28
- data/spec/activerecord_spec.rb +108 -108
- data/spec/amqp_spec.rb +146 -146
- data/spec/tcpsocket_spec.rb +401 -18
- data/spec/timer_spec.rb +7 -0
- metadata +10 -5
data/lib/em-synchrony.rb
CHANGED
@@ -1,103 +1,103 @@
|
|
1
|
-
require 'em-synchrony'
|
2
|
-
require 'active_record'
|
3
|
-
require 'active_record/connection_adapters/abstract/connection_pool'
|
4
|
-
require 'active_record/connection_adapters/abstract_adapter'
|
5
|
-
require 'em-synchrony/thread'
|
6
|
-
|
7
|
-
module ActiveRecord
|
8
|
-
module ConnectionAdapters
|
9
|
-
class ConnectionPool
|
10
|
-
def connection
|
11
|
-
_fibered_mutex.synchronize do
|
12
|
-
@reserved_connections[current_connection_id] ||= checkout
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def _fibered_mutex
|
17
|
-
@fibered_mutex ||= EM::Synchrony::Thread::Mutex.new
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
module EM::Synchrony
|
24
|
-
module ActiveRecord
|
25
|
-
module Client
|
26
|
-
def open_transactions
|
27
|
-
@open_transactions ||= 0
|
28
|
-
end
|
29
|
-
|
30
|
-
def open_transactions=(v)
|
31
|
-
@open_transactions = v
|
32
|
-
end
|
33
|
-
|
34
|
-
def acquired_for_connection_pool
|
35
|
-
@acquired_for_connection_pool ||= 0
|
36
|
-
end
|
37
|
-
|
38
|
-
def acquired_for_connection_pool=(v)
|
39
|
-
@acquired_for_connection_pool = v
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
module Adapter
|
44
|
-
def configure_connection
|
45
|
-
nil
|
46
|
-
end
|
47
|
-
|
48
|
-
def transaction(*args, &blk)
|
49
|
-
@connection.execute(false) do |conn|
|
50
|
-
super
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def real_connection
|
55
|
-
@connection.connection
|
56
|
-
end
|
57
|
-
|
58
|
-
def open_transactions
|
59
|
-
real_connection.open_transactions
|
60
|
-
end
|
61
|
-
|
62
|
-
def increment_open_transactions
|
63
|
-
real_connection.open_transactions += 1
|
64
|
-
end
|
65
|
-
|
66
|
-
def decrement_open_transactions
|
67
|
-
real_connection.open_transactions -= 1
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
class ConnectionPool < EM::Synchrony::ConnectionPool
|
72
|
-
|
73
|
-
# consider connection acquired
|
74
|
-
def execute(async)
|
75
|
-
f = Fiber.current
|
76
|
-
begin
|
77
|
-
conn = acquire(f)
|
78
|
-
conn.acquired_for_connection_pool += 1
|
79
|
-
yield conn
|
80
|
-
ensure
|
81
|
-
conn.acquired_for_connection_pool -= 1
|
82
|
-
release(f) if !async && conn.acquired_for_connection_pool == 0
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def acquire(fiber)
|
87
|
-
return @reserved[fiber.object_id] if @reserved[fiber.object_id]
|
88
|
-
super
|
89
|
-
end
|
90
|
-
|
91
|
-
def connection
|
92
|
-
acquire(Fiber.current)
|
93
|
-
end
|
94
|
-
|
95
|
-
# via method_missing affected_rows will be recognized as async method
|
96
|
-
def affected_rows(*args, &blk)
|
97
|
-
execute(false) do |conn|
|
98
|
-
conn.send(:affected_rows, *args, &blk)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
1
|
+
require 'em-synchrony'
|
2
|
+
require 'active_record'
|
3
|
+
require 'active_record/connection_adapters/abstract/connection_pool'
|
4
|
+
require 'active_record/connection_adapters/abstract_adapter'
|
5
|
+
require 'em-synchrony/thread'
|
6
|
+
|
7
|
+
module ActiveRecord
|
8
|
+
module ConnectionAdapters
|
9
|
+
class ConnectionPool
|
10
|
+
def connection
|
11
|
+
_fibered_mutex.synchronize do
|
12
|
+
@reserved_connections[current_connection_id] ||= checkout
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def _fibered_mutex
|
17
|
+
@fibered_mutex ||= EM::Synchrony::Thread::Mutex.new
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module EM::Synchrony
|
24
|
+
module ActiveRecord
|
25
|
+
module Client
|
26
|
+
def open_transactions
|
27
|
+
@open_transactions ||= 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def open_transactions=(v)
|
31
|
+
@open_transactions = v
|
32
|
+
end
|
33
|
+
|
34
|
+
def acquired_for_connection_pool
|
35
|
+
@acquired_for_connection_pool ||= 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def acquired_for_connection_pool=(v)
|
39
|
+
@acquired_for_connection_pool = v
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Adapter
|
44
|
+
def configure_connection
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def transaction(*args, &blk)
|
49
|
+
@connection.execute(false) do |conn|
|
50
|
+
super
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def real_connection
|
55
|
+
@connection.connection
|
56
|
+
end
|
57
|
+
|
58
|
+
def open_transactions
|
59
|
+
real_connection.open_transactions
|
60
|
+
end
|
61
|
+
|
62
|
+
def increment_open_transactions
|
63
|
+
real_connection.open_transactions += 1
|
64
|
+
end
|
65
|
+
|
66
|
+
def decrement_open_transactions
|
67
|
+
real_connection.open_transactions -= 1
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class ConnectionPool < EM::Synchrony::ConnectionPool
|
72
|
+
|
73
|
+
# consider connection acquired
|
74
|
+
def execute(async)
|
75
|
+
f = Fiber.current
|
76
|
+
begin
|
77
|
+
conn = acquire(f)
|
78
|
+
conn.acquired_for_connection_pool += 1
|
79
|
+
yield conn
|
80
|
+
ensure
|
81
|
+
conn.acquired_for_connection_pool -= 1
|
82
|
+
release(f) if !async && conn.acquired_for_connection_pool == 0
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def acquire(fiber)
|
87
|
+
return @reserved[fiber.object_id] if @reserved[fiber.object_id]
|
88
|
+
super
|
89
|
+
end
|
90
|
+
|
91
|
+
def connection
|
92
|
+
acquire(Fiber.current)
|
93
|
+
end
|
94
|
+
|
95
|
+
# via method_missing affected_rows will be recognized as async method
|
96
|
+
def affected_rows(*args, &blk)
|
97
|
+
execute(false) do |conn|
|
98
|
+
conn.send(:affected_rows, *args, &blk)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
103
|
end
|
data/lib/em-synchrony/amqp.rb
CHANGED
@@ -1,180 +1,180 @@
|
|
1
|
-
begin
|
2
|
-
require "amqp"
|
3
|
-
require "amq/protocol"
|
4
|
-
rescue LoadError => error
|
5
|
-
raise "Missing EM-Synchrony dependency: gem install amqp"
|
6
|
-
end
|
7
|
-
|
8
|
-
module EventMachine
|
9
|
-
module Synchrony
|
10
|
-
module AMQP
|
11
|
-
class Error < RuntimeError; end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def sync &blk
|
15
|
-
fiber = Fiber.current
|
16
|
-
blk.call(fiber)
|
17
|
-
Fiber.yield
|
18
|
-
end
|
19
|
-
|
20
|
-
def sync_cb fiber
|
21
|
-
lambda do |*args|
|
22
|
-
if fiber == Fiber.current
|
23
|
-
return *args
|
24
|
-
else
|
25
|
-
fiber.resume *args
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
%w[connect start run].each do |type|
|
31
|
-
line = __LINE__ + 2
|
32
|
-
code = <<-EOF
|
33
|
-
def #{type}(*params)
|
34
|
-
sync { |f| ::AMQP.#{type}(*params, &sync_cb(f)) }
|
35
|
-
end
|
36
|
-
EOF
|
37
|
-
module_eval(code, __FILE__, line)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class Channel < ::AMQP::Channel
|
42
|
-
def initialize(*params, &block)
|
43
|
-
f = Fiber.current
|
44
|
-
super(*params, &EM::Synchrony::AMQP.sync_cb(f))
|
45
|
-
channel, open_ok = Fiber.yield
|
46
|
-
raise Error.new unless open_ok.is_a?(::AMQ::Protocol::Channel::OpenOk)
|
47
|
-
channel
|
48
|
-
end
|
49
|
-
|
50
|
-
%w[direct fanout topic headers].each do |type|
|
51
|
-
line = __LINE__ + 2
|
52
|
-
code = <<-EOF
|
53
|
-
alias :a#{type} :#{type}
|
54
|
-
def #{type}(name = 'amq.#{type}', opts = {})
|
55
|
-
if exchange = find_exchange(name)
|
56
|
-
extended_opts = Exchange.add_default_options(:#{type}, name, opts, nil)
|
57
|
-
validate_parameters_match!(exchange, extended_opts)
|
58
|
-
exchange
|
59
|
-
else
|
60
|
-
register_exchange(Exchange.new(self, :#{type}, name, opts))
|
61
|
-
end
|
62
|
-
end
|
63
|
-
EOF
|
64
|
-
module_eval(code, __FILE__, line)
|
65
|
-
end
|
66
|
-
|
67
|
-
alias :aqueue! :queue!
|
68
|
-
def queue!(name, opts = {})
|
69
|
-
queue = Queue.new(self, name, opts)
|
70
|
-
register_queue(queue)
|
71
|
-
end
|
72
|
-
|
73
|
-
%w[flow recover tx_select tx_commit tx_rollback reset]
|
74
|
-
.each do |type|
|
75
|
-
line = __LINE__ + 2
|
76
|
-
code = <<-EOF
|
77
|
-
alias :a#{type} :#{type}
|
78
|
-
def #{type}(*params)
|
79
|
-
EM::Synchrony::AMQP.sync { |f| self.a#{type}(*params, &EM::Synchrony::AMQP.sync_cb(f)) }
|
80
|
-
end
|
81
|
-
EOF
|
82
|
-
module_eval(code, __FILE__, line)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
class Consumer < ::AMQP::Consumer
|
87
|
-
alias :aon_delivery :on_delivery
|
88
|
-
def on_delivery(&block)
|
89
|
-
Fiber.new do
|
90
|
-
aon_delivery(&EM::Synchrony::AMQP.sync_cb(Fiber.current))
|
91
|
-
loop { block.call(Fiber.yield) }
|
92
|
-
end.resume
|
93
|
-
self
|
94
|
-
end
|
95
|
-
|
96
|
-
alias :aconsume :consume
|
97
|
-
def consume(nowait = false)
|
98
|
-
ret = EM::Synchrony::AMQP.sync { |f| self.aconsume(nowait, &EM::Synchrony::AMQP.sync_cb(f)) }
|
99
|
-
raise Error.new(ret.to_s) unless ret.is_a?(::AMQ::Protocol::Basic::ConsumeOk)
|
100
|
-
self
|
101
|
-
end
|
102
|
-
|
103
|
-
alias :aresubscribe :resubscribe
|
104
|
-
def resubscribe
|
105
|
-
EM::Synchrony::AMQP.sync { |f| self.aconsume(&EM::Synchrony::AMQP.sync_cb(f)) }
|
106
|
-
self
|
107
|
-
end
|
108
|
-
|
109
|
-
alias :acancel :cancel
|
110
|
-
def cancel(nowait = false)
|
111
|
-
EM::Synchrony::AMQP.sync { |f| self.aconsume(nowait, &EM::Synchrony::AMQP.sync_cb(f)) }
|
112
|
-
self
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
class Exchange < ::AMQP::Exchange
|
117
|
-
def initialize(channel, type, name, opts = {}, &block)
|
118
|
-
f = Fiber.current
|
119
|
-
super(channel, type, name, opts, &EM::Synchrony::AMQP.sync_cb(f))
|
120
|
-
exchange, declare_ok = Fiber.yield
|
121
|
-
raise Error.new unless declare_ok.is_a?(::AMQ::Protocol::Exchange::DeclareOk)
|
122
|
-
exchange
|
123
|
-
end
|
124
|
-
|
125
|
-
alias :apublish :publish
|
126
|
-
def publish payload, options = {}
|
127
|
-
apublish(payload, options)
|
128
|
-
end
|
129
|
-
|
130
|
-
alias :adelete :delete
|
131
|
-
def delete(opts = {})
|
132
|
-
EM::Synchrony::AMQP.sync { |f| adelete(opts, &EM::Synchrony::AMQP.sync_cb(f)) }
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
class Queue < ::AMQP::Queue
|
137
|
-
def initialize(*params)
|
138
|
-
f = Fiber.current
|
139
|
-
super(*params, &EM::Synchrony::AMQP.sync_cb(f))
|
140
|
-
queue, declare_ok = Fiber.yield
|
141
|
-
raise Error.new unless declare_ok.is_a?(::AMQ::Protocol::Queue::DeclareOk)
|
142
|
-
queue
|
143
|
-
end
|
144
|
-
|
145
|
-
alias :asubscribe :subscribe
|
146
|
-
def subscribe &block
|
147
|
-
Fiber.new do
|
148
|
-
asubscribe(&EM::Synchrony::AMQP.sync_cb(Fiber.current))
|
149
|
-
loop { block.call(Fiber.yield) }
|
150
|
-
end.resume
|
151
|
-
end
|
152
|
-
|
153
|
-
%w[bind rebind unbind delete purge pop unsubscribe status].each do |type|
|
154
|
-
line = __LINE__ + 2
|
155
|
-
code = <<-EOF
|
156
|
-
alias :a#{type} :#{type}
|
157
|
-
def #{type}(*params)
|
158
|
-
EM::Synchrony::AMQP.sync { |f| self.a#{type}(*params, &EM::Synchrony::AMQP.sync_cb(f)) }
|
159
|
-
end
|
160
|
-
EOF
|
161
|
-
module_eval(code, __FILE__, line)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
class Session < ::AMQP::Session
|
166
|
-
%w[disconnect].each do |type|
|
167
|
-
line = __LINE__ + 2
|
168
|
-
code = <<-EOF
|
169
|
-
alias :a#{type} :#{type}
|
170
|
-
def #{type}(*params)
|
171
|
-
EM::Synchrony::AMQP.sync { |f| self.a#{type}(*params, &EM::Synchrony::AMQP.sync_cb(f)) }
|
172
|
-
end
|
173
|
-
EOF
|
174
|
-
module_eval(code, __FILE__, line)
|
175
|
-
end
|
176
|
-
end
|
177
|
-
::AMQP.client = ::EM::Synchrony::AMQP::Session
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
1
|
+
begin
|
2
|
+
require "amqp"
|
3
|
+
require "amq/protocol"
|
4
|
+
rescue LoadError => error
|
5
|
+
raise "Missing EM-Synchrony dependency: gem install amqp"
|
6
|
+
end
|
7
|
+
|
8
|
+
module EventMachine
|
9
|
+
module Synchrony
|
10
|
+
module AMQP
|
11
|
+
class Error < RuntimeError; end
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def sync &blk
|
15
|
+
fiber = Fiber.current
|
16
|
+
blk.call(fiber)
|
17
|
+
Fiber.yield
|
18
|
+
end
|
19
|
+
|
20
|
+
def sync_cb fiber
|
21
|
+
lambda do |*args|
|
22
|
+
if fiber == Fiber.current
|
23
|
+
return *args
|
24
|
+
else
|
25
|
+
fiber.resume *args
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
%w[connect start run].each do |type|
|
31
|
+
line = __LINE__ + 2
|
32
|
+
code = <<-EOF
|
33
|
+
def #{type}(*params)
|
34
|
+
sync { |f| ::AMQP.#{type}(*params, &sync_cb(f)) }
|
35
|
+
end
|
36
|
+
EOF
|
37
|
+
module_eval(code, __FILE__, line)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Channel < ::AMQP::Channel
|
42
|
+
def initialize(*params, &block)
|
43
|
+
f = Fiber.current
|
44
|
+
super(*params, &EM::Synchrony::AMQP.sync_cb(f))
|
45
|
+
channel, open_ok = Fiber.yield
|
46
|
+
raise Error.new unless open_ok.is_a?(::AMQ::Protocol::Channel::OpenOk)
|
47
|
+
channel
|
48
|
+
end
|
49
|
+
|
50
|
+
%w[direct fanout topic headers].each do |type|
|
51
|
+
line = __LINE__ + 2
|
52
|
+
code = <<-EOF
|
53
|
+
alias :a#{type} :#{type}
|
54
|
+
def #{type}(name = 'amq.#{type}', opts = {})
|
55
|
+
if exchange = find_exchange(name)
|
56
|
+
extended_opts = Exchange.add_default_options(:#{type}, name, opts, nil)
|
57
|
+
validate_parameters_match!(exchange, extended_opts)
|
58
|
+
exchange
|
59
|
+
else
|
60
|
+
register_exchange(Exchange.new(self, :#{type}, name, opts))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
EOF
|
64
|
+
module_eval(code, __FILE__, line)
|
65
|
+
end
|
66
|
+
|
67
|
+
alias :aqueue! :queue!
|
68
|
+
def queue!(name, opts = {})
|
69
|
+
queue = Queue.new(self, name, opts)
|
70
|
+
register_queue(queue)
|
71
|
+
end
|
72
|
+
|
73
|
+
%w[flow recover tx_select tx_commit tx_rollback reset]
|
74
|
+
.each do |type|
|
75
|
+
line = __LINE__ + 2
|
76
|
+
code = <<-EOF
|
77
|
+
alias :a#{type} :#{type}
|
78
|
+
def #{type}(*params)
|
79
|
+
EM::Synchrony::AMQP.sync { |f| self.a#{type}(*params, &EM::Synchrony::AMQP.sync_cb(f)) }
|
80
|
+
end
|
81
|
+
EOF
|
82
|
+
module_eval(code, __FILE__, line)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class Consumer < ::AMQP::Consumer
|
87
|
+
alias :aon_delivery :on_delivery
|
88
|
+
def on_delivery(&block)
|
89
|
+
Fiber.new do
|
90
|
+
aon_delivery(&EM::Synchrony::AMQP.sync_cb(Fiber.current))
|
91
|
+
loop { block.call(Fiber.yield) }
|
92
|
+
end.resume
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
96
|
+
alias :aconsume :consume
|
97
|
+
def consume(nowait = false)
|
98
|
+
ret = EM::Synchrony::AMQP.sync { |f| self.aconsume(nowait, &EM::Synchrony::AMQP.sync_cb(f)) }
|
99
|
+
raise Error.new(ret.to_s) unless ret.is_a?(::AMQ::Protocol::Basic::ConsumeOk)
|
100
|
+
self
|
101
|
+
end
|
102
|
+
|
103
|
+
alias :aresubscribe :resubscribe
|
104
|
+
def resubscribe
|
105
|
+
EM::Synchrony::AMQP.sync { |f| self.aconsume(&EM::Synchrony::AMQP.sync_cb(f)) }
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
109
|
+
alias :acancel :cancel
|
110
|
+
def cancel(nowait = false)
|
111
|
+
EM::Synchrony::AMQP.sync { |f| self.aconsume(nowait, &EM::Synchrony::AMQP.sync_cb(f)) }
|
112
|
+
self
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class Exchange < ::AMQP::Exchange
|
117
|
+
def initialize(channel, type, name, opts = {}, &block)
|
118
|
+
f = Fiber.current
|
119
|
+
super(channel, type, name, opts, &EM::Synchrony::AMQP.sync_cb(f))
|
120
|
+
exchange, declare_ok = Fiber.yield
|
121
|
+
raise Error.new unless declare_ok.is_a?(::AMQ::Protocol::Exchange::DeclareOk)
|
122
|
+
exchange
|
123
|
+
end
|
124
|
+
|
125
|
+
alias :apublish :publish
|
126
|
+
def publish payload, options = {}
|
127
|
+
apublish(payload, options)
|
128
|
+
end
|
129
|
+
|
130
|
+
alias :adelete :delete
|
131
|
+
def delete(opts = {})
|
132
|
+
EM::Synchrony::AMQP.sync { |f| adelete(opts, &EM::Synchrony::AMQP.sync_cb(f)) }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
class Queue < ::AMQP::Queue
|
137
|
+
def initialize(*params)
|
138
|
+
f = Fiber.current
|
139
|
+
super(*params, &EM::Synchrony::AMQP.sync_cb(f))
|
140
|
+
queue, declare_ok = Fiber.yield
|
141
|
+
raise Error.new unless declare_ok.is_a?(::AMQ::Protocol::Queue::DeclareOk)
|
142
|
+
queue
|
143
|
+
end
|
144
|
+
|
145
|
+
alias :asubscribe :subscribe
|
146
|
+
def subscribe &block
|
147
|
+
Fiber.new do
|
148
|
+
asubscribe(&EM::Synchrony::AMQP.sync_cb(Fiber.current))
|
149
|
+
loop { block.call(Fiber.yield) }
|
150
|
+
end.resume
|
151
|
+
end
|
152
|
+
|
153
|
+
%w[bind rebind unbind delete purge pop unsubscribe status].each do |type|
|
154
|
+
line = __LINE__ + 2
|
155
|
+
code = <<-EOF
|
156
|
+
alias :a#{type} :#{type}
|
157
|
+
def #{type}(*params)
|
158
|
+
EM::Synchrony::AMQP.sync { |f| self.a#{type}(*params, &EM::Synchrony::AMQP.sync_cb(f)) }
|
159
|
+
end
|
160
|
+
EOF
|
161
|
+
module_eval(code, __FILE__, line)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
class Session < ::AMQP::Session
|
166
|
+
%w[disconnect].each do |type|
|
167
|
+
line = __LINE__ + 2
|
168
|
+
code = <<-EOF
|
169
|
+
alias :a#{type} :#{type}
|
170
|
+
def #{type}(*params)
|
171
|
+
EM::Synchrony::AMQP.sync { |f| self.a#{type}(*params, &EM::Synchrony::AMQP.sync_cb(f)) }
|
172
|
+
end
|
173
|
+
EOF
|
174
|
+
module_eval(code, __FILE__, line)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
::AMQP.client = ::EM::Synchrony::AMQP::Session
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|