asir 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -0
- data/lib/asir/transport/buffer.rb +1 -0
- data/lib/asir/version.rb +1 -1
- metadata +3 -7
- data/example/ex12.rb +0 -34
- data/example/ex16.rb +0 -33
- data/example/ex17.rb +0 -42
- data/lib/asir/transport/beanstalk.rb +0 -184
data/ChangeLog
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
2012-12-04 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
|
+
|
3
|
+
* v1.1.1: New version.
|
4
|
+
* Beanstalk: Moved beanstalkd support to gem asir_beanstalk.
|
5
|
+
* Buffer: Buffer needs Delegation.
|
6
|
+
|
1
7
|
2012-12-03 Kurt A. Stephens <ks.github@kurtstephens.com>
|
2
8
|
|
3
9
|
* v1.1.0: New version.
|
data/lib/asir/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -225,12 +225,9 @@ files:
|
|
225
225
|
- example/ex09.rb
|
226
226
|
- example/ex10.rb
|
227
227
|
- example/ex11.rb
|
228
|
-
- example/ex12.rb
|
229
228
|
- example/ex13.rb
|
230
229
|
- example/ex14.rb
|
231
230
|
- example/ex15.rb
|
232
|
-
- example/ex16.rb
|
233
|
-
- example/ex17.rb
|
234
231
|
- example/ex18.rb
|
235
232
|
- example/ex19.rb
|
236
233
|
- example/ex22.rb
|
@@ -297,7 +294,6 @@ files:
|
|
297
294
|
- lib/asir/thread_pool.rb
|
298
295
|
- lib/asir/thread_variable.rb
|
299
296
|
- lib/asir/transport.rb
|
300
|
-
- lib/asir/transport/beanstalk.rb
|
301
297
|
- lib/asir/transport/broadcast.rb
|
302
298
|
- lib/asir/transport/buffer.rb
|
303
299
|
- lib/asir/transport/composite.rb
|
@@ -353,7 +349,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
353
349
|
version: '0'
|
354
350
|
segments:
|
355
351
|
- 0
|
356
|
-
hash:
|
352
|
+
hash: 4360037996371201597
|
357
353
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
358
354
|
none: false
|
359
355
|
requirements:
|
@@ -362,7 +358,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
362
358
|
version: '0'
|
363
359
|
segments:
|
364
360
|
- 0
|
365
|
-
hash:
|
361
|
+
hash: 4360037996371201597
|
366
362
|
requirements: []
|
367
363
|
rubyforge_project:
|
368
364
|
rubygems_version: 1.8.24
|
data/example/ex12.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
# !SLIDE :capture_code_output true
|
2
|
-
# Asynchronous beanstalkd service
|
3
|
-
|
4
|
-
require 'example_helper'
|
5
|
-
require 'asir/transport/beanstalk'
|
6
|
-
require 'asir/coder/zlib'
|
7
|
-
begin
|
8
|
-
Email.asir.transport = t =
|
9
|
-
ASIR::Transport::Beanstalk.new(:address => '127.0.0.1', :port => 30904)
|
10
|
-
t.encoder =
|
11
|
-
ASIR::Coder::Chain.new(:encoders =>
|
12
|
-
[ ASIR::Coder::Marshal.new,
|
13
|
-
ASIR::Coder::Zlib.new, ])
|
14
|
-
t.start_conduit!; sleep 1
|
15
|
-
pr Email.asir.send_email(:pdf_invoice,
|
16
|
-
:to => "user@email.com", :customer => @customer)
|
17
|
-
sleep 2
|
18
|
-
server_process do
|
19
|
-
t.prepare_server!
|
20
|
-
t.run_server!
|
21
|
-
end
|
22
|
-
rescue Object => err
|
23
|
-
$stderr.puts "#{err.inspect}\n#{err.backtrace * "\n"}"
|
24
|
-
ensure
|
25
|
-
t.close; sleep 3; server_kill; sleep 2
|
26
|
-
t.stop_conduit!
|
27
|
-
end
|
28
|
-
|
29
|
-
# !SLIDE END
|
30
|
-
# EXPECT: : client process
|
31
|
-
# EXPECT: : server process
|
32
|
-
# EXPECT: : Email.send_mail :pdf_invoice
|
33
|
-
# EXPECT: : pr: nil
|
34
|
-
|
data/example/ex16.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# !SLIDE :capture_code_output true
|
2
|
-
# Asynchronous beanstalkd service with delay option
|
3
|
-
|
4
|
-
require 'example_helper'
|
5
|
-
require 'asir/transport/beanstalk'
|
6
|
-
begin
|
7
|
-
DelayedService.asir.transport = t =
|
8
|
-
ASIR::Transport::Beanstalk.new(:address => '127.0.0.1', :port => 30916)
|
9
|
-
t.encoder =
|
10
|
-
ASIR::Coder::Marshal.new
|
11
|
-
t.start_conduit!; sleep 1
|
12
|
-
server_process do
|
13
|
-
t.prepare_server!
|
14
|
-
t.run_server!
|
15
|
-
end
|
16
|
-
pr DelayedService.asir.
|
17
|
-
_configure{|req, p| req.delay = 5}.
|
18
|
-
do_it(Time.now)
|
19
|
-
sleep 10
|
20
|
-
rescue Object => err
|
21
|
-
$stderr.puts "#{err.inspect}\n#{err.backtrace * "\n"}"
|
22
|
-
ensure
|
23
|
-
t.close; sleep 1
|
24
|
-
server_kill; sleep 1
|
25
|
-
t.stop_conduit!
|
26
|
-
end
|
27
|
-
|
28
|
-
# !SLIDE END
|
29
|
-
# EXPECT: : client process
|
30
|
-
# EXPECT: : server process
|
31
|
-
# EXPECT: DelayedService.do_it => :ok
|
32
|
-
# EXPECT: : pr: nil
|
33
|
-
|
data/example/ex17.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# !SLIDE :capture_code_output true
|
2
|
-
# Buffered asynchronous beanstalkd service with delay option
|
3
|
-
|
4
|
-
require 'example_helper'
|
5
|
-
require 'asir/transport/beanstalk'
|
6
|
-
require 'asir/transport/buffer'
|
7
|
-
begin
|
8
|
-
t =
|
9
|
-
ASIR::Transport::Beanstalk.new(:address => '127.0.0.1', :port => 30917)
|
10
|
-
t.encoder =
|
11
|
-
ASIR::Coder::Marshal.new
|
12
|
-
t.start_conduit!; sleep 1
|
13
|
-
DelayedService.asir.transport =
|
14
|
-
t0 = ASIR::Transport::Buffer.new(:transport => t)
|
15
|
-
t0.pause!
|
16
|
-
server_process do
|
17
|
-
t.prepare_server!
|
18
|
-
t.run_server!
|
19
|
-
end
|
20
|
-
pr [ :paused?, t0.paused?, :at, Time.now.iso8601(2) ]
|
21
|
-
pr DelayedService.asir.
|
22
|
-
_configure{|req, p| req.delay = 5}.
|
23
|
-
do_it(Time.now)
|
24
|
-
sleep 2
|
25
|
-
pr [ :resuming, :size, t0.size, :at, Time.now.iso8601(2) ]
|
26
|
-
t0.resume!
|
27
|
-
pr [ :paused?, t0.paused?, :size, t0.size, :at, Time.now.iso8601(2) ]
|
28
|
-
pr [ :resumed, :size, t0.size, :at, Time.now.iso8601(2) ]
|
29
|
-
sleep 7
|
30
|
-
rescue Object => err
|
31
|
-
$stderr.puts "#{err.inspect}\n#{err.backtrace * "\n"}"
|
32
|
-
ensure
|
33
|
-
t.close; sleep 1; server_kill; sleep 1
|
34
|
-
t.stop_conduit!
|
35
|
-
end
|
36
|
-
|
37
|
-
# !SLIDE END
|
38
|
-
# EXPECT: : client process
|
39
|
-
# EXPECT: : server process
|
40
|
-
# EXPECT: DelayedService.do_it => :ok
|
41
|
-
# EXPECT: : pr: nil
|
42
|
-
|
@@ -1,184 +0,0 @@
|
|
1
|
-
require 'asir/transport/tcp_socket'
|
2
|
-
|
3
|
-
module ASIR
|
4
|
-
class Transport
|
5
|
-
# !SLIDE
|
6
|
-
# Beanstalk Transport
|
7
|
-
class Beanstalk < TcpSocket
|
8
|
-
LINE_TERMINATOR = "\r\n".freeze
|
9
|
-
|
10
|
-
attr_accessor :tube, :priority, :delay, :ttr
|
11
|
-
|
12
|
-
def initialize *args
|
13
|
-
@port ||= 11300
|
14
|
-
@tube ||= 'asir'
|
15
|
-
@priority ||= 0
|
16
|
-
@delay ||= 0
|
17
|
-
@ttr ||= 600
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
# !SLIDE
|
22
|
-
# Sends the encoded Message payload String.
|
23
|
-
def _send_message message, message_payload
|
24
|
-
stream.with_stream! do | s |
|
25
|
-
begin
|
26
|
-
match =
|
27
|
-
_beanstalk(s,
|
28
|
-
"put #{message[:beanstalk_priority] || @priority} #{message[:beanstalk_delay] || @delay} #{message[:beanstalk_ttr] || @ttr} #{message_payload.size}\r\n",
|
29
|
-
/\AINSERTED (\d+)\r\n\Z/,
|
30
|
-
message_payload)
|
31
|
-
job_id = message[:beanstalk_job_id] = match[1].to_i
|
32
|
-
_log { "beanstalk_job_id = #{job_id.inspect}" } if @verbose >= 2
|
33
|
-
rescue ::Exception => exc
|
34
|
-
message[:beanstalk_error] = exc
|
35
|
-
close
|
36
|
-
raise exc
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
RESERVE = "reserve\r\n".freeze
|
42
|
-
|
43
|
-
# !SLIDE
|
44
|
-
# Receives the encoded Message payload String.
|
45
|
-
def _receive_message channel, additional_data
|
46
|
-
channel.with_stream! do | stream |
|
47
|
-
begin
|
48
|
-
match =
|
49
|
-
_beanstalk(stream,
|
50
|
-
RESERVE,
|
51
|
-
/\ARESERVED (\d+) (\d+)\r\n\Z/)
|
52
|
-
additional_data[:beanstalk_job_id] = match[1].to_i
|
53
|
-
additional_data[:beanstalk_message_size] =
|
54
|
-
size = match[2].to_i
|
55
|
-
message_payload = stream.read(size)
|
56
|
-
_read_line_and_expect! stream, /\A\r\n\Z/
|
57
|
-
# Pass the original stream used to #_send_result below.
|
58
|
-
[ message_payload, stream ]
|
59
|
-
rescue ::Exception => exc
|
60
|
-
_log { [ :_receive_message, :exception, exc ] }
|
61
|
-
additional_data[:beanstalk_error] = exc
|
62
|
-
channel.close
|
63
|
-
raise exc
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# !SLIDE
|
69
|
-
# Sends the encoded Result payload String.
|
70
|
-
def _send_result message, result, result_payload, channel, stream
|
71
|
-
#
|
72
|
-
# There is a possibility here the following could happen:
|
73
|
-
#
|
74
|
-
# _receive_message
|
75
|
-
# channel == #<Channel:1>
|
76
|
-
# channel.stream == #<TCPSocket:1234>
|
77
|
-
# end
|
78
|
-
# ...
|
79
|
-
# ERROR OCCURES:
|
80
|
-
# channel.stream.close
|
81
|
-
# channel.stream = nil
|
82
|
-
# ...
|
83
|
-
# _send_result
|
84
|
-
# channel == #<Channel:1>
|
85
|
-
# channel.stream == #<TCPSocket:5678> # NEW CONNECTION
|
86
|
-
# stream.write "delete #{job_id}"
|
87
|
-
# ...
|
88
|
-
#
|
89
|
-
# Therefore: _receiver_message passes the original message stream to us.
|
90
|
-
# We insure that the same stream is still the active one and use it.
|
91
|
-
channel.with_stream! do | maybe_other_stream |
|
92
|
-
_log [ :_send_result, "stream lost" ] if maybe_other_stream != stream
|
93
|
-
job_id = message[:beanstalk_job_id] or raise "no beanstalk_job_id"
|
94
|
-
_beanstalk(stream,
|
95
|
-
"delete #{job_id}\r\n",
|
96
|
-
/\ADELETED\r\n\Z/)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
# !SLIDE
|
101
|
-
# Receives the encoded Result payload String.
|
102
|
-
def _receive_result message, opaque_result
|
103
|
-
nil
|
104
|
-
end
|
105
|
-
|
106
|
-
# !SLIDE
|
107
|
-
# Sets beanstalk_delay if message.delay was specified.
|
108
|
-
def relative_message_delay! message, now = nil
|
109
|
-
if delay = super
|
110
|
-
message[:beanstalk_delay] = delay.to_i
|
111
|
-
end
|
112
|
-
delay
|
113
|
-
end
|
114
|
-
|
115
|
-
# !SLIDE
|
116
|
-
# Beanstalk protocol support
|
117
|
-
|
118
|
-
# Send "something ...\r\n".
|
119
|
-
# Expect /\ASOMETHING (\d+)...\r\n".
|
120
|
-
def _beanstalk stream, message, expect, payload = nil
|
121
|
-
_log { [ :_beanstalk, :message, message ] } if @verbose >= 3
|
122
|
-
stream.write message
|
123
|
-
if payload
|
124
|
-
stream.write payload
|
125
|
-
stream.write LINE_TERMINATOR
|
126
|
-
end
|
127
|
-
stream.flush
|
128
|
-
if match = _read_line_and_expect!(stream, expect)
|
129
|
-
_log { [ :_beanstalk, :result, match[0] ] } if @verbose >= 3
|
130
|
-
end
|
131
|
-
match
|
132
|
-
end
|
133
|
-
|
134
|
-
def _after_connect! stream
|
135
|
-
if @tube
|
136
|
-
_beanstalk(stream,
|
137
|
-
"use #{@tube}\r\n",
|
138
|
-
/\AUSING #{@tube}\r\n\Z/)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
# !SLIDE
|
143
|
-
# Beanstalk Server
|
144
|
-
def _server!
|
145
|
-
_log { "_server! #{uri}" } if @verbose >= 1
|
146
|
-
@server = connect!(:try_max => nil,
|
147
|
-
:try_sleep => 1,
|
148
|
-
:try_sleep_increment => 0.1,
|
149
|
-
:try_sleep_max => 10) do | stream |
|
150
|
-
if @tube
|
151
|
-
_beanstalk(stream,
|
152
|
-
"watch #{@tube}\r\n",
|
153
|
-
/\AWATCHING (\d+)\r\n\Z/)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
self
|
157
|
-
end
|
158
|
-
|
159
|
-
def _server_accept_connection! server
|
160
|
-
prepare_server! unless @server
|
161
|
-
[ @server, @server ]
|
162
|
-
end
|
163
|
-
|
164
|
-
def _server_close_connection! in_stream, out_stream
|
165
|
-
# NOTHING
|
166
|
-
end
|
167
|
-
|
168
|
-
def stream_eof? stream
|
169
|
-
# Note: stream.eof? on a beanstalkd connection,
|
170
|
-
# will cause blocking read *forever* because
|
171
|
-
# beanstalk connections are long lived.
|
172
|
-
false
|
173
|
-
end
|
174
|
-
|
175
|
-
def _start_conduit!
|
176
|
-
addr = address ? "-l #{address} " : ""
|
177
|
-
cmd = "beanstalkd #{addr}-p #{port}"
|
178
|
-
exec(cmd)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
# !SLIDE END
|
182
|
-
end # class
|
183
|
-
end # module
|
184
|
-
|