asir 1.1.0 → 1.1.1
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/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
|
-
|