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 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.
@@ -1,4 +1,5 @@
1
1
  require 'asir/transport'
2
+ require 'asir/transport/delegation'
2
3
  require 'thread'
3
4
 
4
5
  module ASIR
@@ -1,3 +1,3 @@
1
1
  module ASIR
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
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.0
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: 2626327431831346289
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: 2626327431831346289
361
+ hash: 4360037996371201597
366
362
  requirements: []
367
363
  rubyforge_project:
368
364
  rubygems_version: 1.8.24
@@ -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
-
@@ -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
-
@@ -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
-