asir 0.2.0 → 1.0.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/Gemfile +1 -2
- data/README.textile +4 -2
- data/VERSION +1 -1
- data/asir.gemspec +1 -4
- data/asir.riterate.yml +1 -0
- data/bin/asir +2 -1
- data/example/asir_control.sh +63 -1
- data/example/asir_control_client_http.rb +2 -2
- data/example/asir_control_client_resque.rb +16 -0
- data/example/asir_control_client_zmq.rb +3 -3
- data/example/config/asir_config.rb +20 -8
- data/example/ex02.rb +1 -1
- data/example/ex03.rb +2 -2
- data/example/ex04.rb +2 -2
- data/example/ex05.rb +1 -1
- data/example/ex06.rb +6 -5
- data/example/ex07.rb +2 -2
- data/example/ex08.rb +2 -2
- data/example/ex09.rb +2 -2
- data/example/ex10.rb +2 -2
- data/example/ex11.rb +5 -5
- data/example/ex12.rb +6 -6
- data/example/ex13.rb +4 -4
- data/example/ex14.rb +4 -4
- data/example/ex15.rb +2 -2
- data/example/ex16.rb +8 -8
- data/example/ex17.rb +12 -11
- data/example/ex18.rb +5 -5
- data/example/ex19.rb +3 -3
- data/example/ex20.rb +3 -3
- data/example/ex21.rb +3 -3
- data/example/ex22.rb +1 -1
- data/example/ex23.rb +2 -2
- data/example/ex24.rb +4 -4
- data/example/ex25.rb +41 -0
- data/example/example_helper.rb +38 -3
- data/example/sample_service.rb +4 -4
- data/hack_night/exercise/prob-3.rb +3 -3
- data/hack_night/exercise/prob-6.rb +2 -2
- data/hack_night/exercise/prob-7.rb +2 -2
- data/hack_night/solution/prob-2.rb +2 -2
- data/hack_night/solution/prob-3.rb +3 -3
- data/hack_night/solution/prob-6.rb +7 -6
- data/hack_night/solution/prob-7.rb +6 -6
- data/{spec → lab}/const_get_speed_spec.rb +0 -0
- data/lib/asir.rb +29 -7
- data/lib/asir/additional_data.rb +25 -0
- data/lib/asir/channel.rb +4 -5
- data/lib/asir/client.rb +29 -13
- data/lib/asir/config.rb +8 -0
- data/lib/asir/description.rb +34 -0
- data/lib/asir/environment.rb +96 -0
- data/lib/asir/error.rb +4 -1
- data/lib/asir/invoker.rb +14 -0
- data/lib/asir/main.rb +84 -103
- data/lib/asir/message.rb +1 -1
- data/lib/asir/poll_throttle.rb +53 -0
- data/lib/asir/retry_behavior.rb +1 -1
- data/lib/asir/thread_variable.rb +183 -0
- data/lib/asir/transport.rb +36 -23
- data/lib/asir/transport/beanstalk.rb +18 -52
- data/lib/asir/transport/conduit.rb +42 -0
- data/lib/asir/transport/connection_oriented.rb +32 -56
- data/lib/asir/transport/delegation.rb +5 -5
- data/lib/asir/transport/demux.rb +33 -0
- data/lib/asir/transport/file.rb +5 -3
- data/lib/asir/transport/payload_io.rb +8 -4
- data/lib/asir/transport/resque.rb +212 -0
- data/lib/asir/transport/stream.rb +19 -9
- data/lib/asir/transport/tcp_socket.rb +3 -2
- data/lib/asir/transport/zmq.rb +14 -17
- data/lib/asir/uri_config.rb +51 -0
- data/lib/asir/version.rb +1 -1
- data/spec/client_spec.rb +48 -0
- data/spec/demux_spec.rb +38 -0
- data/spec/json_spec.rb +0 -2
- data/spec/message_spec.rb +68 -0
- data/spec/performance_spec.rb +66 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/thread_variable_spec.rb +135 -0
- data/spec/transport_spec.rb +82 -0
- metadata +28 -4
data/Gemfile
CHANGED
data/README.textile
CHANGED
@@ -28,10 +28,11 @@ h3. Features
|
|
28
28
|
** HTTP under WEBrick or as Rack application.
|
29
29
|
** Beanstalkd.
|
30
30
|
** ZeroMQ.
|
31
|
+
** Resque.
|
31
32
|
** Buffered transports.
|
32
33
|
** Broadcast transports.
|
33
34
|
** Fallback transports.
|
34
|
-
** Time-decaying retry logic.
|
35
|
+
** Time-decaying retry and polling logic.
|
35
36
|
* Support for multiple encodings:
|
36
37
|
** Marshal.
|
37
38
|
** XML.
|
@@ -42,7 +43,8 @@ h3. Features
|
|
42
43
|
** Chained encodings.
|
43
44
|
** Signed payloads.
|
44
45
|
|
45
|
-
h2. Platform support
|
46
|
+
h2. Platform support
|
47
|
+
|
46
48
|
* CRuby 1.8.7
|
47
49
|
* CRuby 1.9.3-head
|
48
50
|
* CRuby 2.0-head
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.1
|
data/asir.gemspec
CHANGED
@@ -1,11 +1,8 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
6
3
|
Gem::Specification.new do |s|
|
7
4
|
s.name = %q{asir}
|
8
|
-
s.version = "0.
|
5
|
+
s.version = "1.0.1"
|
9
6
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
10
7
|
s.authors = ["Kurt Stephens"]
|
11
8
|
s.date = %q{2012-04-03}
|
data/asir.riterate.yml
CHANGED
data/bin/asir
CHANGED
data/example/asir_control.sh
CHANGED
@@ -4,21 +4,83 @@ dir="$(cd "$(dirname $0)" && /bin/pwd)"
|
|
4
4
|
PATH="$dir/../bin:$PATH"
|
5
5
|
export RUBYLIB="$dir/../example:$dir/../lib"
|
6
6
|
asir="asir verbose=9 config_rb=$dir/config/asir_config.rb"
|
7
|
-
|
7
|
+
args="$*"
|
8
|
+
args="${args:-ALL}"
|
8
9
|
# set -e
|
10
|
+
|
11
|
+
#############################
|
12
|
+
|
13
|
+
case "$args"
|
14
|
+
in
|
15
|
+
*webrick*|*ALL*)
|
16
|
+
|
9
17
|
$asir start webrick worker
|
10
18
|
sleep 1
|
19
|
+
$asir pid webrick worker
|
20
|
+
if $asir alive webrick worker; then
|
21
|
+
echo "alive webrick worker"
|
22
|
+
fi
|
11
23
|
|
12
24
|
ruby "$dir/asir_control_client_http.rb"
|
13
25
|
sleep 1
|
14
26
|
|
15
27
|
$asir stop webrick worker
|
16
28
|
sleep 1
|
29
|
+
$asir pid webrick worker
|
30
|
+
|
31
|
+
;;
|
32
|
+
esac
|
33
|
+
|
34
|
+
#############################
|
35
|
+
|
36
|
+
case "$args"
|
37
|
+
in
|
38
|
+
*zmq*|*ALL*)
|
17
39
|
|
18
40
|
$asir start zmq worker
|
19
41
|
sleep 1
|
42
|
+
$asir pid zmq worker
|
43
|
+
if $asir alive zmq worker; then
|
44
|
+
echo "alive"
|
45
|
+
fi
|
20
46
|
|
21
47
|
ruby "$dir/asir_control_client_zmq.rb"
|
22
48
|
sleep 1
|
23
49
|
|
50
|
+
$asir stop zmq worker
|
51
|
+
sleep 1
|
52
|
+
$asir pid zmq worker
|
53
|
+
|
54
|
+
;;
|
55
|
+
esac
|
56
|
+
|
57
|
+
#############################
|
58
|
+
|
59
|
+
case "$args"
|
60
|
+
in
|
61
|
+
*resque*|*ALL*)
|
62
|
+
|
63
|
+
$asir start resque conduit
|
64
|
+
sleep 1
|
65
|
+
if $asir alive resque conduit; then
|
66
|
+
echo "resque conduit alive"
|
67
|
+
fi
|
68
|
+
$asir start resque worker
|
69
|
+
sleep 1
|
70
|
+
$asir pid resque worker
|
71
|
+
if $asir alive resque worker; then
|
72
|
+
echo "resque worker alive"
|
73
|
+
fi
|
74
|
+
|
75
|
+
ruby "$dir/asir_control_client_resque.rb"
|
76
|
+
sleep 1
|
77
|
+
$asir stop resque worker
|
78
|
+
sleep 1
|
79
|
+
$asir stop resque conduit
|
80
|
+
|
81
|
+
;;
|
82
|
+
esac
|
83
|
+
|
84
|
+
#############################
|
85
|
+
|
24
86
|
exit 0
|
@@ -2,10 +2,10 @@ require 'example_helper'
|
|
2
2
|
require 'asir/transport/http'
|
3
3
|
require 'asir/coder/marshal'
|
4
4
|
begin
|
5
|
-
Email.
|
5
|
+
Email.asir.transport = t =
|
6
6
|
ASIR::Transport::HTTP.new(:uri => "http://localhost:30000/asir")
|
7
7
|
t.encoder = ASIR::Coder::Marshal.new
|
8
|
-
pr Email.
|
8
|
+
pr Email.asir.send_email(:pdf_invoice,
|
9
9
|
:to => "user@email.com",
|
10
10
|
:customer => @customer)
|
11
11
|
ensure
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'example_helper'
|
2
|
+
gem 'resque'
|
3
|
+
require 'asir/transport/resque'
|
4
|
+
require 'asir/coder/marshal'
|
5
|
+
begin
|
6
|
+
Email.asir.transport = t =
|
7
|
+
ASIR::Transport::Resque.new
|
8
|
+
t.one_way = true
|
9
|
+
t.encoder = ASIR::Coder::Marshal.new
|
10
|
+
pr Email.asir.send_email(:pdf_invoice,
|
11
|
+
:to => "user@email.com",
|
12
|
+
:customer => @customer)
|
13
|
+
ensure
|
14
|
+
t.close rescue nil
|
15
|
+
end
|
16
|
+
|
@@ -2,11 +2,11 @@ require 'example_helper'
|
|
2
2
|
require 'asir/transport/zmq'
|
3
3
|
require 'asir/coder/marshal'
|
4
4
|
begin
|
5
|
-
Email.
|
6
|
-
ASIR::Transport::Zmq.new
|
5
|
+
Email.asir.transport = t =
|
6
|
+
ASIR::Transport::Zmq.new(:uri => "tcp://localhost:31000") # "/asir"
|
7
7
|
t.one_way = true
|
8
8
|
t.encoder = ASIR::Coder::Marshal.new
|
9
|
-
pr Email.
|
9
|
+
pr Email.asir.send_email(:pdf_invoice,
|
10
10
|
:to => "user@email.com",
|
11
11
|
:customer => @customer)
|
12
12
|
ensure
|
@@ -1,13 +1,15 @@
|
|
1
1
|
# Used by asir/bin/asir.
|
2
2
|
# Configures asir worker transport and error logging.
|
3
|
-
# asir object is bound to ASIR::
|
3
|
+
# asir object is bound to ASIR::Environment instance.
|
4
4
|
|
5
|
-
$stderr.puts "asir.
|
6
|
-
case asir.
|
7
|
-
when :
|
5
|
+
$stderr.puts "asir.phase = #{asir.phase.inspect}" if asir.verbose >= 1
|
6
|
+
case asir.phase
|
7
|
+
when :configure
|
8
8
|
# NOTHING
|
9
9
|
true
|
10
10
|
when :environment
|
11
|
+
require 'rubygems'
|
12
|
+
|
11
13
|
require 'asir'
|
12
14
|
require 'asir/transport/file'
|
13
15
|
require 'asir/coder/marshal'
|
@@ -17,6 +19,9 @@ when :environment
|
|
17
19
|
require 'example_helper'
|
18
20
|
require 'sample_service'
|
19
21
|
require 'unsafe_service'
|
22
|
+
when :start
|
23
|
+
# NOTHING
|
24
|
+
true
|
20
25
|
when :transport
|
21
26
|
# Compose with Marshal for final coding.
|
22
27
|
coder = ASIR::Coder::Marshal.new
|
@@ -32,18 +37,25 @@ when :transport
|
|
32
37
|
# Setup requested Transport.
|
33
38
|
case asir.adjective
|
34
39
|
when :beanstalk
|
40
|
+
require 'asir/transport/beanstalk'
|
35
41
|
transport = ASIR::Transport::Beanstalk.new
|
36
|
-
transport[:worker_processes] = 3
|
37
42
|
when :http, :webrick
|
43
|
+
require 'asir/transport/webrick'
|
38
44
|
transport = ASIR::Transport::Webrick.new
|
39
45
|
transport.uri = "http://localhost:#{30000 + asir.identifier.to_s.to_i}/asir"
|
40
46
|
when :rack
|
47
|
+
require 'asir/transport/rack'
|
41
48
|
transport = ASIR::Transport::Rack.new
|
42
49
|
transport.uri = "http://localhost:#{30000 + asir.identifier.to_s.to_i}/asir"
|
43
50
|
when :zmq
|
51
|
+
reqiore 'asir/transport/zmq'
|
44
52
|
transport = ASIR::Transport::Zmq.new
|
45
53
|
transport.one_way = true
|
46
54
|
transport.uri = "tcp://localhost:#{31000 + asir.identifier.to_s.to_i}" # /asir"
|
55
|
+
when :resque
|
56
|
+
gem 'resque'
|
57
|
+
require 'asir/transport/resque'
|
58
|
+
transport = ASIR::Transport::Resque.new
|
47
59
|
else
|
48
60
|
raise "Cannot configure Transport for #{asir.adjective}"
|
49
61
|
end
|
@@ -51,13 +63,13 @@ when :transport
|
|
51
63
|
transport.encoder = coder
|
52
64
|
transport._logger = STDERR
|
53
65
|
transport._log_enabled = true
|
54
|
-
transport.verbose = 3
|
66
|
+
# transport.verbose = 3
|
55
67
|
transport.on_exception =
|
56
|
-
lambda { | transport, exc, phase, message,
|
68
|
+
lambda { | transport, exc, phase, message, result |
|
57
69
|
error_transport.send_request(message)
|
58
70
|
}
|
59
71
|
|
60
72
|
transport
|
61
73
|
else
|
62
|
-
$stderr.puts "Warning: unhandled asir.
|
74
|
+
$stderr.puts "Warning: unhandled asir.phase: #{asir.phase.inspect}"
|
63
75
|
end
|
data/example/ex02.rb
CHANGED
data/example/ex03.rb
CHANGED
@@ -4,10 +4,10 @@
|
|
4
4
|
|
5
5
|
require 'example_helper'
|
6
6
|
begin
|
7
|
-
Email.
|
7
|
+
Email.asir.transport = t =
|
8
8
|
ASIR::Transport::Subprocess.new
|
9
9
|
|
10
|
-
pr Email.
|
10
|
+
pr Email.asir.send_email(:pdf_invoice,
|
11
11
|
:to => "user@email.com",
|
12
12
|
:customer => @customer)
|
13
13
|
end
|
data/example/ex04.rb
CHANGED
@@ -4,11 +4,11 @@
|
|
4
4
|
require 'example_helper'
|
5
5
|
begin
|
6
6
|
File.unlink(service_log = "#{__FILE__}.service.log") rescue nil
|
7
|
-
Email.
|
7
|
+
Email.asir.transport = t =
|
8
8
|
ASIR::Transport::File.new(:file => service_log)
|
9
9
|
t.encoder =
|
10
10
|
ASIR::Coder::Yaml.new
|
11
|
-
pr Email.
|
11
|
+
pr Email.asir.send_email(:pdf_invoice,
|
12
12
|
:to => "user@email.com",
|
13
13
|
:customer => @customer)
|
14
14
|
ensure
|
data/example/ex05.rb
CHANGED
data/example/ex06.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
# !SLIDE :capture_code_output true
|
2
2
|
# One-way, named pipe service
|
3
3
|
|
4
|
+
$stderr.puts " #{$$} at #{__FILE__}:#{__LINE__}"
|
5
|
+
|
4
6
|
require 'example_helper'
|
5
7
|
begin
|
6
8
|
File.unlink(service_pipe = "service.pipe") rescue nil
|
7
|
-
Email.
|
9
|
+
Email.asir.transport = t =
|
8
10
|
ASIR::Transport::File.new(:file => service_pipe)
|
9
11
|
t.encoder =
|
10
12
|
ASIR::Coder::Yaml.new
|
11
|
-
t.prepare_pipe_server!
|
12
13
|
server_process do
|
13
|
-
t.
|
14
|
+
t.prepare_server!
|
15
|
+
t.run_server!
|
14
16
|
end
|
15
|
-
|
16
|
-
pr Email.client.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
|
17
|
+
pr Email.asir.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
|
17
18
|
ensure
|
18
19
|
t.close; sleep 1; server_kill
|
19
20
|
end
|
data/example/ex07.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
require 'example_helper'
|
5
5
|
begin
|
6
6
|
File.unlink(service_pipe = "service.pipe") rescue nil
|
7
|
-
Email.
|
7
|
+
Email.asir.transport = t =
|
8
8
|
ASIR::Transport::File.new(:file => service_pipe)
|
9
9
|
t.encoder =
|
10
10
|
ASIR::Coder::Chain.new(:encoders =>
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
server_process do
|
17
17
|
t.run_pipe_server!
|
18
18
|
end
|
19
|
-
pr Email.
|
19
|
+
pr Email.asir.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
|
20
20
|
ensure
|
21
21
|
t.close; sleep 1; server_kill
|
22
22
|
end
|
data/example/ex08.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
require 'example_helper'
|
5
5
|
begin
|
6
6
|
File.unlink(service_pipe = "service.pipe") rescue nil
|
7
|
-
Email.
|
7
|
+
Email.asir.transport = t =
|
8
8
|
ASIR::Transport::File.new(:file => service_pipe)
|
9
9
|
t.encoder =
|
10
10
|
ASIR::Coder::Chain.new(:encoders =>
|
@@ -17,7 +17,7 @@ begin
|
|
17
17
|
t.run_pipe_server!
|
18
18
|
end
|
19
19
|
s.secret = 'I do not know the secret! :('
|
20
|
-
pr Email.
|
20
|
+
pr Email.asir.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
|
21
21
|
ensure
|
22
22
|
t.close; sleep 1; server_kill
|
23
23
|
end
|
data/example/ex09.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'example_helper'
|
5
5
|
begin
|
6
|
-
Email.
|
6
|
+
Email.asir.transport = t =
|
7
7
|
ASIR::Transport::TcpSocket.new(:port => 30909)
|
8
8
|
t.encoder =
|
9
9
|
ASIR::Coder::Marshal.new
|
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
server_process do
|
12
12
|
t.run_server!
|
13
13
|
end
|
14
|
-
pr Email.
|
14
|
+
pr Email.asir.send_email(:pdf_invoice,
|
15
15
|
:to => "user@email.com", :customer => @customer)
|
16
16
|
ensure
|
17
17
|
t.close; sleep 1; server_kill
|
data/example/ex10.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'example_helper'
|
5
5
|
begin
|
6
|
-
Email.
|
6
|
+
Email.asir.transport = t =
|
7
7
|
ASIR::Transport::TcpSocket.new(:port => 30910)
|
8
8
|
t.encoder =
|
9
9
|
ASIR::Coder::Marshal.new
|
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
server_process do
|
12
12
|
t.run_server!
|
13
13
|
end
|
14
|
-
pr Email.
|
14
|
+
pr Email.asir.do_raise("Raise Me!")
|
15
15
|
rescue Exception => err
|
16
16
|
pr [ :exception, err ]
|
17
17
|
ensure
|
data/example/ex11.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
require 'example_helper'
|
5
5
|
begin
|
6
6
|
File.unlink(service_log = "#{__FILE__}.service.log") rescue nil
|
7
|
-
Email.
|
7
|
+
Email.asir.transport = t =
|
8
8
|
ASIR::Transport::Fallback.new(:transports => [
|
9
9
|
tcp = ASIR::Transport::TcpSocket.new(:port => 31911,
|
10
10
|
:encoder => ASIR::Coder::Marshal.new),
|
@@ -14,13 +14,13 @@ begin
|
|
14
14
|
ASIR::Transport::Subprocess.new,
|
15
15
|
]),
|
16
16
|
])
|
17
|
-
pr Email.
|
17
|
+
pr Email.asir.send_email(:pdf_invoice,
|
18
18
|
:to => "user@email.com", :customer => @customer)
|
19
19
|
server_process do
|
20
20
|
tcp.prepare_server!
|
21
21
|
tcp.run_server!
|
22
|
-
end
|
23
|
-
pr Email.
|
22
|
+
end
|
23
|
+
pr Email.asir.send_email(:pdf_invoice,
|
24
24
|
:to => "user2@email.com", :customer => @customer)
|
25
25
|
ensure
|
26
26
|
file.close rescue nil;
|
@@ -38,7 +38,7 @@ end
|
|
38
38
|
# EXPECT: service.log" contents:
|
39
39
|
# EXPECT: --- !ruby/object:ASIR::Message
|
40
40
|
# EXPECT: :transport_exceptions:
|
41
|
-
# EXPECT:
|
41
|
+
# EXPECT: Cannot connect to ASIR::Transport::TcpSocket tcp://127.0.0.1:
|
42
42
|
# EXPECT: arguments:
|
43
43
|
# EXPECT: - :pdf_invoice
|
44
44
|
# EXPECT/: :to: user@email.com
|