message 0.0.1 → 0.0.2
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/README.md +21 -2
- data/lib/message/worker.rb +45 -16
- data/lib/message.rb +6 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Message
|
2
2
|
|
3
|
+
https://travis-ci.org/xli/message.svg?branch=master
|
4
|
+
|
3
5
|
Message provides flexible & reliable background/asynchronous job processing mechanism on top of simple queue interface.
|
4
6
|
|
5
7
|
Any developer can create queue adapter for Message to hook up different messaging/queue system.
|
@@ -11,24 +13,41 @@ and you can easily swap in other queues later.
|
|
11
13
|
## Installation
|
12
14
|
|
13
15
|
|
16
|
+
### Use AWS SQS as back-end queue system
|
17
|
+
|
18
|
+
gem 'message-sqs'
|
14
19
|
|
15
20
|
## How to use
|
16
21
|
|
17
22
|
### Queuing jobs
|
18
23
|
|
19
24
|
|
20
|
-
Inspired by delayed_job API, call .
|
25
|
+
Inspired by delayed_job API, call .async.method(params) on any object and it will be processed in the background.
|
21
26
|
|
22
27
|
# without message
|
23
28
|
@img.resize(36)
|
24
29
|
|
25
30
|
# with message
|
26
|
-
@img.
|
31
|
+
@img.async.resize(36)
|
27
32
|
|
28
33
|
### Start worker to process jobs
|
29
34
|
|
30
35
|
Message.worker.start
|
31
36
|
|
37
|
+
### Change to synchronize mode
|
38
|
+
|
39
|
+
Message.worker.synch = true
|
40
|
+
|
41
|
+
This is designed for test environment or Rails development environment.
|
42
|
+
After set the synch option to true, the async jobs will be processed immediately when .async.method(params) is called.
|
43
|
+
The default value is false.
|
44
|
+
|
45
|
+
### Change default worker job name
|
46
|
+
|
47
|
+
For some environment or queue system (e.g. AWS SQS), you will need set an application specific job name, so that you can share same account for multiple applications using Message.
|
48
|
+
|
49
|
+
Message.worker.default_job = "app-name-#{Rails.env}-message-default"
|
50
|
+
|
32
51
|
## Job interface specification
|
33
52
|
|
34
53
|
Job = a queue + message processor
|
data/lib/message/worker.rb
CHANGED
@@ -18,38 +18,49 @@ module Message
|
|
18
18
|
unless @obj.respond_to?(m)
|
19
19
|
raise NoMethodError, "undefined method `#{m}' for #{@obj.inspect}"
|
20
20
|
end
|
21
|
-
|
21
|
+
Message.worker(@job) << [@obj, m, args]
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
Enq.new(self, job)
|
25
|
+
def async(job=nil)
|
26
|
+
Enq.new(self, job || Message.worker.default_job)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
class << self
|
31
|
-
|
32
|
-
|
31
|
+
attr_accessor :default_job, :synch
|
32
|
+
|
33
|
+
def default_job
|
34
|
+
@default_job ||= DEFAULT_JOB_NAME
|
33
35
|
end
|
34
36
|
|
35
|
-
def
|
36
|
-
|
37
|
+
def default
|
38
|
+
new(default_job)
|
37
39
|
end
|
38
40
|
|
39
|
-
def
|
40
|
-
|
41
|
+
def process(*args)
|
42
|
+
default.process(*args)
|
41
43
|
end
|
42
44
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
def start(*args)
|
46
|
+
default.start(*args)
|
47
|
+
end
|
48
|
+
|
49
|
+
def jobs
|
50
|
+
@jobs ||= RUBY_PLATFORM =~ /java/ ? java.util.concurrent.ConcurrentHashMap.new : {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def reset
|
54
|
+
@default_job = nil
|
55
|
+
@synch = nil
|
56
|
+
@jobs = nil
|
48
57
|
end
|
49
58
|
end
|
50
59
|
|
60
|
+
attr_reader :job_name
|
61
|
+
|
51
62
|
def initialize(job_name)
|
52
|
-
@job_name = job_name
|
63
|
+
@job_name = job_name
|
53
64
|
end
|
54
65
|
|
55
66
|
def start(size=10, interval=1)
|
@@ -68,10 +79,28 @@ module Message
|
|
68
79
|
end
|
69
80
|
|
70
81
|
def process(size=1)
|
71
|
-
|
82
|
+
job.process(size)
|
72
83
|
end
|
73
84
|
|
85
|
+
def enq(work)
|
86
|
+
job.enq(YAML.dump(work)).tap do
|
87
|
+
process if self.class.synch
|
88
|
+
end
|
89
|
+
end
|
90
|
+
alias :<< :enq
|
91
|
+
|
74
92
|
private
|
93
|
+
def job
|
94
|
+
self.class.jobs[@job_name] ||= Message.job(@job_name, &job_processor)
|
95
|
+
end
|
96
|
+
|
97
|
+
def job_processor
|
98
|
+
lambda do |msg|
|
99
|
+
obj, m, args = YAML.load(msg)
|
100
|
+
obj.send(m, *args)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
75
104
|
def log(level, &block)
|
76
105
|
Message.logger.send(level) { "[Worker(#{Thread.current.object_id})] #{block.call}" }
|
77
106
|
end
|
data/lib/message.rb
CHANGED
@@ -22,7 +22,11 @@ module Message
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def worker(job=nil)
|
25
|
-
|
25
|
+
if job
|
26
|
+
Worker.new(job)
|
27
|
+
else
|
28
|
+
Worker
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
def logger
|
@@ -36,6 +40,7 @@ module Message
|
|
36
40
|
def reset
|
37
41
|
Message.queue.reset
|
38
42
|
Message.job.reset
|
43
|
+
Message.worker.reset
|
39
44
|
end
|
40
45
|
|
41
46
|
reset
|