arsenicum 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -0
- data/lib/arsenicum/configuration.rb +63 -5
- data/lib/arsenicum/core/broker.rb +48 -38
- data/lib/arsenicum/core/io_helper.rb +1 -1
- data/lib/arsenicum/core/worker.rb +64 -5
- data/lib/arsenicum/logger.rb +20 -0
- data/lib/arsenicum/main.rb +28 -3
- data/lib/arsenicum/{async/queue → queue}/sqs.rb +9 -10
- data/lib/arsenicum/queue.rb +51 -0
- data/lib/arsenicum/routing/default.rb +4 -2
- data/lib/arsenicum/routing/router.rb +9 -0
- data/lib/arsenicum/routing.rb +1 -0
- data/lib/arsenicum/task/class_dispatcher.rb +6 -3
- data/lib/arsenicum/version.rb +1 -1
- data/lib/arsenicum.rb +3 -1
- metadata +6 -4
- data/lib/arsenicum/async/queue.rb +0 -37
- data/lib/arsenicum/async.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4866821d70fe2b9fe4dff4f307112af69edbfc2d
|
4
|
+
data.tar.gz: fdbaf8062df32ef04e239294e8aea76fafe0718f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5b2b277ddd87b3af7c1878c0da83f35eb9b155f1c5f7f50edd39421ee3b9d5dc82cde8ce43407b08370aa6ceed5a5a871d76346981d308d38bf497fdb5307d0
|
7
|
+
data.tar.gz: 9939c248c291b176fd0368ad4065e341a3a166ae8f13139282f5ab2ed01acd9544503df2cb8deb1b19cd40453c493c5949d1b8c63146dd97fcd151435e937ac1
|
data/Rakefile
ADDED
@@ -4,16 +4,33 @@ module Arsenicum
|
|
4
4
|
class MisconfigurationError < StandardError;end
|
5
5
|
|
6
6
|
class Configuration
|
7
|
-
attr_reader :pidfile_path,
|
7
|
+
attr_reader :pidfile_path, :daemon, :stdout_path, :stderr_path, :logger_config
|
8
8
|
|
9
9
|
def initialize
|
10
|
-
@pidfile_path
|
10
|
+
@pidfile_path = 'arsenicum.pid'
|
11
|
+
@logger_config = LoggerConfiguration.new
|
11
12
|
end
|
12
13
|
|
13
14
|
def queue_configurations
|
14
15
|
@queue_configurations ||= []
|
15
16
|
end
|
16
17
|
|
18
|
+
def daemonize
|
19
|
+
@daemon = true
|
20
|
+
end
|
21
|
+
|
22
|
+
def stdout(path)
|
23
|
+
@stdout_path = path
|
24
|
+
end
|
25
|
+
|
26
|
+
def stderr(path)
|
27
|
+
@stderr_path = path
|
28
|
+
end
|
29
|
+
|
30
|
+
def logger(&block)
|
31
|
+
logger_config.instance_eval &block
|
32
|
+
end
|
33
|
+
|
17
34
|
def queue(name, &block)
|
18
35
|
queue_config = QueueConfiguration.new name
|
19
36
|
queue_config.instance_eval &block if block_given?
|
@@ -67,14 +84,20 @@ module Arsenicum
|
|
67
84
|
end
|
68
85
|
|
69
86
|
class QueueConfiguration < Arsenicum::Configuration::InstanceConfiguration
|
70
|
-
attr_reader :worker_count, :
|
71
|
-
namespace Arsenicum::
|
87
|
+
attr_reader :worker_count, :router_class
|
88
|
+
namespace Arsenicum::Queue
|
72
89
|
|
73
90
|
def initialize(name)
|
74
91
|
super(name)
|
75
92
|
@worker_count = 2
|
76
93
|
end
|
77
94
|
|
95
|
+
def router(name)
|
96
|
+
@router_class = constantize(classify(name))
|
97
|
+
rescue NameError
|
98
|
+
@router_class = constantize(classify(name), inside: Arsenicum::Routing)
|
99
|
+
end
|
100
|
+
|
78
101
|
def workers(count)
|
79
102
|
@worker_count = count
|
80
103
|
end
|
@@ -90,7 +113,7 @@ module Arsenicum
|
|
90
113
|
end
|
91
114
|
|
92
115
|
def build
|
93
|
-
|
116
|
+
klass.new(name, init_parameters.merge(router_class: router_class)).tap do |queue|
|
94
117
|
task_configurations.each do |task_config|
|
95
118
|
queue.register task_config.build
|
96
119
|
end
|
@@ -102,6 +125,41 @@ module Arsenicum
|
|
102
125
|
namespace Arsenicum::Task
|
103
126
|
end
|
104
127
|
|
128
|
+
class LoggerConfiguration
|
129
|
+
attr_reader :log_path, :log_level, :log_format
|
130
|
+
|
131
|
+
def initialize
|
132
|
+
@log_path = STDOUT
|
133
|
+
@log_level = :info
|
134
|
+
end
|
135
|
+
|
136
|
+
def path path
|
137
|
+
@log_path = path
|
138
|
+
end
|
139
|
+
|
140
|
+
def level level
|
141
|
+
@log_level = level
|
142
|
+
end
|
143
|
+
|
144
|
+
def format &format
|
145
|
+
@log_format = format
|
146
|
+
end
|
147
|
+
|
148
|
+
def build
|
149
|
+
logger = ::Logger.new(output_stream)
|
150
|
+
logger.level = ::Logger.const_get log_level.to_s.upcase.to_sym
|
151
|
+
logger.formatter = log_format if log_format
|
152
|
+
logger
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
def output_stream
|
157
|
+
return log_path if log_path.respond_to? :write
|
158
|
+
return File.open(log_path, 'w:UTF-8') if log_path.is_a? String
|
159
|
+
STDOUT
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
105
163
|
class ConfigurationHash < Hash
|
106
164
|
def in_configuration?
|
107
165
|
@in_configuration
|
@@ -1,10 +1,10 @@
|
|
1
1
|
class Arsenicum::Core::Broker
|
2
2
|
include Arsenicum::Core::IOHelper
|
3
3
|
|
4
|
-
attr_reader
|
4
|
+
attr_reader :router
|
5
5
|
|
6
|
-
attr_reader
|
7
|
-
attr_reader
|
6
|
+
attr_reader :workers, :available_workers, :mutex
|
7
|
+
attr_reader :worker_count, :worker_options, :tasks
|
8
8
|
attr_accessor :default_task
|
9
9
|
|
10
10
|
PROCESSOR_COUNT_DEFAULT = 2
|
@@ -21,10 +21,6 @@ class Arsenicum::Core::Broker
|
|
21
21
|
@worker_options.merge! serializer: serializer, formatter: formatter
|
22
22
|
end
|
23
23
|
|
24
|
-
def register_task(task_id, task)
|
25
|
-
tasks[task_id.to_sym] = task
|
26
|
-
end
|
27
|
-
|
28
24
|
def [](task_id)
|
29
25
|
tasks[task_id.to_sym] || default_task
|
30
26
|
end
|
@@ -33,48 +29,30 @@ class Arsenicum::Core::Broker
|
|
33
29
|
tasks[task_id.to_sym] = task
|
34
30
|
end
|
35
31
|
|
32
|
+
alias_method :register, :[]=
|
33
|
+
|
36
34
|
def run
|
37
35
|
@workers = {}
|
38
36
|
@available_workers = {}
|
39
37
|
|
40
|
-
|
41
|
-
prepare_worker
|
42
|
-
end
|
38
|
+
prepare_workers
|
43
39
|
end
|
44
40
|
|
45
|
-
def
|
46
|
-
worker =
|
47
|
-
|
48
|
-
|
41
|
+
def broker(success_handler, failure_handler, task_id, *parameters)
|
42
|
+
worker = loop do
|
43
|
+
w = next_worker
|
44
|
+
break w if w
|
49
45
|
|
50
|
-
def stock(worker)
|
51
|
-
mutex.synchronize do
|
52
|
-
pid = worker.run
|
53
|
-
workers[pid] = worker
|
54
|
-
available_workers[pid] = worker
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def broker(task_id, *parameters)
|
59
|
-
until (worker = next_worker)
|
60
46
|
sleep 0.5
|
61
47
|
end
|
62
48
|
|
63
|
-
|
64
|
-
|
65
|
-
ensure
|
66
|
-
if worker.active?
|
67
|
-
get_back_worker(worker)
|
68
|
-
else
|
69
|
-
remove(worker)
|
70
|
-
prepare_worker
|
71
|
-
end
|
72
|
-
end
|
49
|
+
Arsenicum::Logger.info { "[broker][Task brokering]id=#{task_id}, params=#{parameters.inspect}" }
|
50
|
+
worker.ask_async success_handler, failure_handler, task_id, *parameters
|
73
51
|
end
|
74
52
|
|
75
|
-
def delegate(message)
|
53
|
+
def delegate(message, success_handler, failure_handler)
|
76
54
|
(task_id, parameters) = router.route(message)
|
77
|
-
broker task_id,
|
55
|
+
broker success_handler, failure_handler, task_id, parameters
|
78
56
|
end
|
79
57
|
|
80
58
|
def remove(worker)
|
@@ -84,14 +62,46 @@ class Arsenicum::Core::Broker
|
|
84
62
|
end
|
85
63
|
end
|
86
64
|
|
87
|
-
def
|
88
|
-
|
65
|
+
def reload
|
66
|
+
workers.each(&:stop)
|
67
|
+
|
68
|
+
workers.clear
|
69
|
+
available_workers.clear
|
70
|
+
|
71
|
+
prepare_workers
|
89
72
|
end
|
90
73
|
|
91
74
|
def get_back_worker(worker)
|
92
75
|
mutex.synchronize{available_workers[worker.pid] = worker}
|
93
76
|
end
|
94
77
|
|
78
|
+
private
|
79
|
+
def prepare_workers
|
80
|
+
@worker_count.times do
|
81
|
+
prepare_worker
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def prepare_worker
|
86
|
+
worker = Arsenicum::Core::Worker.new(self, worker_options)
|
87
|
+
stock(worker)
|
88
|
+
end
|
89
|
+
|
90
|
+
def stock(worker)
|
91
|
+
mutex.synchronize do
|
92
|
+
pid = worker.run
|
93
|
+
workers[pid] = worker
|
94
|
+
available_workers[pid] = worker
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def next_worker
|
99
|
+
mutex.synchronize do
|
100
|
+
(_, worker) = available_workers.shift
|
101
|
+
worker
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
95
105
|
def serialize(value = {})
|
96
106
|
serializer.serialize value
|
97
107
|
end
|
@@ -4,19 +4,20 @@ class Arsenicum::Core::Worker
|
|
4
4
|
include Arsenicum::Core::Commands
|
5
5
|
include Arsenicum::Core::IOHelper
|
6
6
|
|
7
|
-
attr_reader :pid, :in_parent, :out_parent,
|
7
|
+
attr_reader :pid, :in_parent, :out_parent, :thread,
|
8
8
|
:in_child, :out_child, :active, :broker, :serializer, :formatter
|
9
9
|
alias_method :active?, :active
|
10
10
|
|
11
11
|
def initialize(broker, worker_configuration)
|
12
|
-
@broker
|
12
|
+
@broker = WeakRef.new broker # avoiding circular references.
|
13
13
|
@serializer = worker_configuration[:serializer]
|
14
14
|
@formatter = worker_configuration[:formatter]
|
15
|
+
@thread = InvokerThread.new(self)
|
15
16
|
end
|
16
17
|
|
17
18
|
def run
|
18
|
-
(@in_parent, @out_child) =
|
19
|
-
(@in_child, @out_parent) =
|
19
|
+
(@in_parent, @out_child) = open_binary_pipes
|
20
|
+
(@in_child, @out_parent) = open_binary_pipes
|
20
21
|
|
21
22
|
@pid = fork do
|
22
23
|
[in_parent, out_parent].each(&:close)
|
@@ -24,7 +25,9 @@ class Arsenicum::Core::Worker
|
|
24
25
|
begin
|
25
26
|
loop do
|
26
27
|
begin
|
28
|
+
Arsenicum::Logger.debug {log_message_for 'to read initial command'}
|
27
29
|
command = read_code in_child
|
30
|
+
Arsenicum::Logger.debug {log_message_for 'Command: 0x%02x' % command}
|
28
31
|
break if command == COMMAND_STOP
|
29
32
|
task_id_string = read_string in_child
|
30
33
|
content = read_string in_child
|
@@ -57,17 +60,33 @@ class Arsenicum::Core::Worker
|
|
57
60
|
pid
|
58
61
|
end
|
59
62
|
|
63
|
+
def open_binary_pipes
|
64
|
+
IO.pipe.each do |io|
|
65
|
+
io.set_encoding 'BINARY'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def ask_async(success_handler, failure_handler, task_id, *parameters)
|
70
|
+
thread.ask success_handler, failure_handler, task_id, *parameters
|
71
|
+
end
|
72
|
+
|
60
73
|
def ask(task_id, *parameter)
|
74
|
+
Arsenicum::Logger.info {log_message_for "Task ID: #{task_id}"}
|
75
|
+
|
61
76
|
write_code out_parent, COMMAND_TASK
|
62
77
|
write_string out_parent, task_id.to_s
|
63
78
|
write_string out_parent, serialize(parameter)
|
64
79
|
|
80
|
+
Arsenicum::Logger.debug { log_message_for "Task ID: #{task_id}: Request completed. Begin waiting for the reply." }
|
81
|
+
|
65
82
|
result = read_code in_parent
|
66
83
|
return if result == 0
|
67
84
|
raise Marshal.restore(read_string in_parent, encoding: 'BINARY')
|
85
|
+
ensure
|
86
|
+
return_to_broker
|
68
87
|
end
|
69
88
|
|
70
|
-
def
|
89
|
+
def stop
|
71
90
|
write_code out_parent, COMMAND_STOP
|
72
91
|
Process.waitpid pid
|
73
92
|
end
|
@@ -88,4 +107,44 @@ class Arsenicum::Core::Worker
|
|
88
107
|
end
|
89
108
|
end
|
90
109
|
end
|
110
|
+
|
111
|
+
def return_to_broker
|
112
|
+
broker.get_back_worker self
|
113
|
+
end
|
114
|
+
|
115
|
+
def log_message_for(message)
|
116
|
+
"[Worker ##{object_id}]#{message}"
|
117
|
+
end
|
118
|
+
|
119
|
+
class InvokerThread < Thread
|
120
|
+
attr_accessor :task_request
|
121
|
+
private :task_request, :task_request=
|
122
|
+
|
123
|
+
def ask(success_handler, failure_handler, task_id, *parameters)
|
124
|
+
self.task_request = [success_handler, failure_handler, task_id, parameters]
|
125
|
+
end
|
126
|
+
|
127
|
+
def initialize(worker)
|
128
|
+
super do
|
129
|
+
loop do
|
130
|
+
next sleep(0.5) unless task_request
|
131
|
+
(success_handler, failure_handler, task_id, parameter) = task_request
|
132
|
+
|
133
|
+
begin
|
134
|
+
worker.ask task_id, *parameter
|
135
|
+
success_handler.call
|
136
|
+
rescue Exception => e
|
137
|
+
Arsenicum::Logger.error {log_message_for worker, "Exception: #{e.class.name}"}
|
138
|
+
failure_handler.call e
|
139
|
+
ensure
|
140
|
+
self.task_request = nil
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def log_message_for(worker, message)
|
147
|
+
"[Worker ##{worker.object_id}][thread]#{message}"
|
148
|
+
end
|
149
|
+
end
|
91
150
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Arsenicum::Logger
|
4
|
+
class << self
|
5
|
+
attr_reader :logger
|
6
|
+
|
7
|
+
def configure(logger_config)
|
8
|
+
@logger = logger_config.build
|
9
|
+
end
|
10
|
+
|
11
|
+
[:debug, :info, :warn, :error, :fatal].each do |method|
|
12
|
+
eval <<-METHOD, binding, __FILE__, __LINE__ + 1
|
13
|
+
def #{method}(*args, &block)
|
14
|
+
return unless logger
|
15
|
+
logger.#{method}(*args, &block)
|
16
|
+
end
|
17
|
+
METHOD
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/arsenicum/main.rb
CHANGED
@@ -7,9 +7,17 @@ module Arsenicum
|
|
7
7
|
script = File.read config_file
|
8
8
|
config.instance_eval script, config_file, 1
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
if config.daemon
|
11
|
+
Process.daemonize
|
12
|
+
|
13
|
+
File.open(config.pidfile_path, 'w:UTF-8') do |f|
|
14
|
+
f.puts $$
|
15
|
+
end
|
12
16
|
end
|
17
|
+
|
18
|
+
configure_io config
|
19
|
+
configure_log config
|
20
|
+
|
13
21
|
threads = config.queue_configurations.map{|qc|qc.build.start_async}
|
14
22
|
|
15
23
|
begin
|
@@ -18,6 +26,23 @@ module Arsenicum
|
|
18
26
|
end
|
19
27
|
end
|
20
28
|
|
21
|
-
|
29
|
+
private
|
30
|
+
def configure_io(config)
|
31
|
+
$stdout = File.open(config.stdout_path, 'a:UTF-8') if config.stdout_path
|
32
|
+
|
33
|
+
if config.stderr_path
|
34
|
+
if config.stdout_path && config.stdout_path == config.stderr_path
|
35
|
+
$stderr = $stdout
|
36
|
+
else
|
37
|
+
$stderr = File.open(config.stderr_path, 'a:UTF-8')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def configure_log(config)
|
43
|
+
Arsenicum::Logger.configure config.logger_config
|
44
|
+
end
|
45
|
+
|
46
|
+
module_function :run, :configure_io, :configure_log
|
22
47
|
end
|
23
48
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'aws-sdk'
|
2
2
|
require 'multi_json'
|
3
3
|
|
4
|
-
class Arsenicum::
|
4
|
+
class Arsenicum::Queue::Sqs < Arsenicum::Queue
|
5
5
|
attr_reader :sqs_queue, :via_sns
|
6
6
|
|
7
7
|
def initialize(name, options = {})
|
@@ -13,15 +13,14 @@ class Arsenicum::Async::Queue::Sqs < Arsenicum::Async::Queue
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def pick
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
message = sqs_message = sqs_queue.receive_message
|
17
|
+
return unless message
|
18
|
+
message = message.as_sns_message if via_sns
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
20
|
+
[MultiJson.decode(message.body), sqs_message]
|
21
|
+
end
|
22
|
+
|
23
|
+
def handle_success(original_message)
|
24
|
+
original_message.delete
|
26
25
|
end
|
27
26
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'weakref'
|
2
|
+
|
3
|
+
class Arsenicum::Queue
|
4
|
+
|
5
|
+
attr_reader :name, :worker_count, :router
|
6
|
+
attr_reader :broker
|
7
|
+
|
8
|
+
def initialize(name, options)
|
9
|
+
@name = name
|
10
|
+
@worker_count = options.delete(:worker_count)
|
11
|
+
@router = build_router options.delete(:router_class)
|
12
|
+
@broker = Arsenicum::Core::Broker.new worker_count: worker_count, router: router
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
Arsenicum::Logger.info "[queue]Queue #{name} is now starting"
|
17
|
+
broker.run
|
18
|
+
Arsenicum::Logger.info "[queue]Queue #{name} start-up completed"
|
19
|
+
|
20
|
+
loop do
|
21
|
+
(message, original_message) = pick
|
22
|
+
next sleep(0.5) unless message
|
23
|
+
|
24
|
+
broker.delegate message, -> { handle_success(original_message) }, -> e { handle_failure(e, original_message) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def register(task)
|
29
|
+
broker[task.id] = task
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_success(original_message)
|
33
|
+
#TODO implement correctly in your derived classes.
|
34
|
+
end
|
35
|
+
|
36
|
+
def handle_failure(e, original_message)
|
37
|
+
#TODO implement correctly in your derived classes.
|
38
|
+
end
|
39
|
+
|
40
|
+
def start_async
|
41
|
+
Thread.new{start}
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def build_router(router_class)
|
46
|
+
return unless router_class
|
47
|
+
router_class.new self
|
48
|
+
end
|
49
|
+
|
50
|
+
autoload :Sqs, 'arsenicum/queue/sqs'
|
51
|
+
end
|
data/lib/arsenicum/routing.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
class Arsenicum::Task::ClassDispatcher < Arsenicum::Task
|
2
|
+
include Arsenicum::Util
|
3
|
+
|
2
4
|
attr_reader :target_class, :target_method
|
3
5
|
private :target_class, :target_method
|
4
6
|
|
5
7
|
def initialize(id, options)
|
6
8
|
super(id)
|
7
|
-
|
8
|
-
@
|
9
|
+
(klass, method) = options[:target].split('#', 2)
|
10
|
+
@target_class = constantize klass
|
11
|
+
@target_method = target_class.instance_method method.to_sym
|
9
12
|
end
|
10
13
|
|
11
14
|
def run(*parameters)
|
12
|
-
target_class.new.
|
15
|
+
target_method.bind(target_class.new).call *parameters
|
13
16
|
end
|
14
17
|
|
15
18
|
end
|
data/lib/arsenicum/version.rb
CHANGED
data/lib/arsenicum.rb
CHANGED
@@ -6,10 +6,12 @@ module Arsenicum
|
|
6
6
|
autoload :Version, 'arsenicum/version'
|
7
7
|
autoload :Serializer, 'arsenicum/serializer'
|
8
8
|
autoload :Formatter, 'arsenicum/formatter'
|
9
|
-
autoload :
|
9
|
+
autoload :Queue, 'arsenicum/queue'
|
10
10
|
autoload :Main, 'arsenicum/main'
|
11
11
|
autoload :IO, 'arsenicum/io'
|
12
12
|
autoload :Task, 'arsenicum/task'
|
13
|
+
autoload :Routing, 'arsenicum/routing'
|
14
|
+
autoload :Logger, 'arsenicum/logger'
|
13
15
|
|
14
16
|
class << self
|
15
17
|
def configure(arg = nil, &block)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arsenicum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- condor
|
@@ -135,14 +135,12 @@ files:
|
|
135
135
|
- Gemfile
|
136
136
|
- LICENSE.txt
|
137
137
|
- README.md
|
138
|
+
- Rakefile
|
138
139
|
- arsenicum.gemspec
|
139
140
|
- bin/arsenicum
|
140
141
|
- bin/arsenicum_rails
|
141
142
|
- lib/arsenicum-rails.rb
|
142
143
|
- lib/arsenicum.rb
|
143
|
-
- lib/arsenicum/async.rb
|
144
|
-
- lib/arsenicum/async/queue.rb
|
145
|
-
- lib/arsenicum/async/queue/sqs.rb
|
146
144
|
- lib/arsenicum/configuration.rb
|
147
145
|
- lib/arsenicum/core.rb
|
148
146
|
- lib/arsenicum/core/broker.rb
|
@@ -151,9 +149,13 @@ files:
|
|
151
149
|
- lib/arsenicum/core/worker.rb
|
152
150
|
- lib/arsenicum/formatter.rb
|
153
151
|
- lib/arsenicum/io.rb
|
152
|
+
- lib/arsenicum/logger.rb
|
154
153
|
- lib/arsenicum/main.rb
|
154
|
+
- lib/arsenicum/queue.rb
|
155
|
+
- lib/arsenicum/queue/sqs.rb
|
155
156
|
- lib/arsenicum/routing.rb
|
156
157
|
- lib/arsenicum/routing/default.rb
|
158
|
+
- lib/arsenicum/routing/router.rb
|
157
159
|
- lib/arsenicum/serializer.rb
|
158
160
|
- lib/arsenicum/serializer/json.rb
|
159
161
|
- lib/arsenicum/task.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
class Arsenicum::Async::Queue < Arsenicum::Core::Broker
|
2
|
-
|
3
|
-
attr_accessor :broker
|
4
|
-
attr_reader :name, :worker_count, :router
|
5
|
-
attr_reader :broker
|
6
|
-
|
7
|
-
def initialize(name, options)
|
8
|
-
@name = name
|
9
|
-
@worker_count = options.delete(:worker_count)
|
10
|
-
@router = options.delete(:router)
|
11
|
-
@broker = Arsenicum::Core::Broker.new worker_count: worker_count, router: router
|
12
|
-
end
|
13
|
-
|
14
|
-
def start
|
15
|
-
loop do
|
16
|
-
(message, success_handler, failure_handler) = pick
|
17
|
-
next sleep(0.5) unless message
|
18
|
-
|
19
|
-
begin
|
20
|
-
broker.delegate message
|
21
|
-
success_handler.call if success_handler
|
22
|
-
rescue Exception => e
|
23
|
-
failure_handler.call(e) if failure_handler
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def register_task(task)
|
29
|
-
broker[task.id] = task
|
30
|
-
end
|
31
|
-
|
32
|
-
def start_async
|
33
|
-
Thread.new{start}
|
34
|
-
end
|
35
|
-
|
36
|
-
autoload :Sqs, 'arsenicum/async/queue/sqs'
|
37
|
-
end
|
data/lib/arsenicum/async.rb
DELETED