insque 0.4.3 → 0.5.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.
- checksums.yaml +4 -4
- data/insque.gemspec +3 -2
- data/lib/insque/version.rb +1 -1
- data/lib/insque.rb +57 -23
- data/lib/tasks/insque.rake +2 -0
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db352d3e0afe2bfd0243f0e9cd15a905226ae4fe
|
4
|
+
data.tar.gz: 9ea0abcc665e264a0c51d1be4a20a9ba3e8d1ce7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf57b0954f22ce0f5628df247942a732af6b4e61fab2b85667651107408091703f7ec733eaed175cd9f54911ca665a5c6d9dffebb55c06beb7c0de9a6c129970
|
7
|
+
data.tar.gz: 2c2d5ae8ba1839d06b2f50519754c38ec2476178a88805570b099f32c63c95edcd4d3e91be05c30e4ed183edd862052b1b64cc8593281021419372b7dcd53663
|
data/insque.gemspec
CHANGED
@@ -5,8 +5,9 @@ Gem::Specification.new do |gem|
|
|
5
5
|
gem.authors = ["gropher"]
|
6
6
|
gem.email = ["grophen@gmail.com"]
|
7
7
|
gem.description = "Instant queue. Background processing and message driven communication tool. Faster and simplier alternative to Resque."
|
8
|
-
gem.summary = "
|
8
|
+
gem.summary = "Redis-based multi-threaded queue"
|
9
9
|
gem.homepage = "https://github.com/Gropher/Insque"
|
10
|
+
gem.licenses = ['MIT']
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
12
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -15,5 +16,5 @@ Gem::Specification.new do |gem|
|
|
15
16
|
gem.require_paths = ["lib"]
|
16
17
|
gem.version = Insque::VERSION
|
17
18
|
|
18
|
-
gem.add_dependency('redis', '>= 2.2.2'
|
19
|
+
gem.add_dependency('redis', '~> 2.2', '>= 2.2.2')
|
19
20
|
end
|
data/lib/insque/version.rb
CHANGED
data/lib/insque.rb
CHANGED
@@ -7,16 +7,33 @@ module Insque
|
|
7
7
|
@debug = debug
|
8
8
|
end
|
9
9
|
|
10
|
+
def self.redis= redis
|
11
|
+
@redis = redis
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.redis
|
15
|
+
@redis
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.redis_class= klass
|
19
|
+
@redis_class = klass
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.redis_config
|
23
|
+
@redis_config
|
24
|
+
end
|
25
|
+
|
10
26
|
def self.redis_config= redis
|
11
27
|
@redis_config = redis
|
12
|
-
@redis =
|
13
|
-
@redis.select 7
|
28
|
+
@redis = self.create_redis_connection
|
14
29
|
end
|
15
30
|
|
16
31
|
def self.sender= sender
|
17
32
|
@sender = sender
|
18
|
-
@inbox = "
|
19
|
-
@processing = "
|
33
|
+
@inbox = "{insque}inbox_#{sender}"
|
34
|
+
@processing = "{insque}processing_#{sender}"
|
35
|
+
@slow_inbox = "{insque}slow_inbox_#{sender}"
|
36
|
+
@slow_processing = "{insque}slow_processing_#{sender}"
|
20
37
|
create_send_later_handler
|
21
38
|
end
|
22
39
|
|
@@ -24,9 +41,11 @@ module Insque
|
|
24
41
|
keys = []
|
25
42
|
case recipient
|
26
43
|
when :any
|
27
|
-
keys = @redis.smembers '
|
44
|
+
keys = @redis.smembers '{insque}inboxes'
|
28
45
|
when :self
|
29
46
|
keys = [@inbox]
|
47
|
+
when :slow
|
48
|
+
keys = [@slow_inbox]
|
30
49
|
else
|
31
50
|
keys = recipient.is_a?(Array) ? recipient : [recipient]
|
32
51
|
end
|
@@ -37,14 +56,29 @@ module Insque
|
|
37
56
|
end
|
38
57
|
end
|
39
58
|
|
40
|
-
def self.listen worker_name=''
|
41
|
-
redis
|
42
|
-
redis.
|
59
|
+
def self.listen worker_name='', redis=nil
|
60
|
+
redis ||= create_redis_connection
|
61
|
+
redis.sadd '{insque}inboxes', @inbox
|
62
|
+
do_listen @inbox, @processing, redis, worker_name
|
63
|
+
end
|
43
64
|
|
44
|
-
|
45
|
-
|
65
|
+
def self.slow_listen worker_name='', redis=nil
|
66
|
+
do_listen @slow_inbox, @slow_processing, (redis || create_redis_connection), worker_name
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.janitor redis=nil
|
70
|
+
real_janitor @inbox, @processing, (redis || create_redis_connection)
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.slow_janitor redis=nil
|
74
|
+
real_janitor @slow_inbox, @slow_processing, (redis || create_redis_connection)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
def self.do_listen inbox, processing, redis, worker_name
|
79
|
+
log "#{worker_name} START LISTENING #{inbox}"
|
46
80
|
loop do
|
47
|
-
message = redis.brpoplpush(
|
81
|
+
message = redis.brpoplpush(inbox, processing, 0)
|
48
82
|
log "#{worker_name} RECEIVING: #{message}" if @debug
|
49
83
|
begin
|
50
84
|
parsed_message = JSON.parse message
|
@@ -54,20 +88,17 @@ module Insque
|
|
54
88
|
log e.inspect
|
55
89
|
log e.backtrace
|
56
90
|
end
|
57
|
-
redis.lrem
|
91
|
+
redis.lrem processing, 0, message
|
58
92
|
end
|
59
93
|
end
|
60
94
|
|
61
|
-
def self.
|
62
|
-
redis = Redis.new @redis_config
|
63
|
-
redis.select 7
|
64
|
-
|
95
|
+
def self.real_janitor inbox, processing, redis
|
65
96
|
loop do
|
66
|
-
redis.watch
|
97
|
+
redis.watch processing
|
67
98
|
errors = []
|
68
99
|
restart = []
|
69
100
|
delete = []
|
70
|
-
redis.lrange(
|
101
|
+
redis.lrange(processing, 0, -1).each do |m|
|
71
102
|
begin
|
72
103
|
parsed_message = JSON.parse(m)
|
73
104
|
if parsed_message['restarted_at'] && DateTime.parse(parsed_message['restarted_at']) < 1.hour.ago.utc
|
@@ -82,8 +113,8 @@ module Insque
|
|
82
113
|
end
|
83
114
|
end
|
84
115
|
result = redis.multi do |r|
|
85
|
-
restart.each {|m| r.lpush
|
86
|
-
delete.each {|m| r.lrem
|
116
|
+
restart.each {|m| r.lpush inbox, m.to_json }
|
117
|
+
delete.each {|m| r.lrem processing, 0, m }
|
87
118
|
end
|
88
119
|
if result
|
89
120
|
errors.each {|m| log "ERROR: #{m.to_json}" }
|
@@ -96,7 +127,10 @@ module Insque
|
|
96
127
|
end
|
97
128
|
end
|
98
129
|
|
99
|
-
|
130
|
+
def self.create_redis_connection
|
131
|
+
(@redis_class || Redis).new @redis_config
|
132
|
+
end
|
133
|
+
|
100
134
|
def self.log message
|
101
135
|
print "#{Time.now.utc} #{message}\n"
|
102
136
|
STDOUT.flush if @debug
|
@@ -112,14 +146,14 @@ end
|
|
112
146
|
if defined?(ActiveRecord::Base)
|
113
147
|
class ActiveRecord::Base
|
114
148
|
def send_later(method, *args)
|
115
|
-
Insque.broadcast :send_later, {:class => self.class.name, :id => id, :method => method, :args => args }, :
|
149
|
+
Insque.broadcast :send_later, {:class => self.class.name, :id => id, :method => method, :args => args }, :slow
|
116
150
|
end
|
117
151
|
def self.acts_as_insque_crud(*args)
|
118
152
|
options = args.extract_options!
|
119
153
|
excluded = (options[:exclude] || []).map(&:to_s)
|
120
154
|
|
121
155
|
set_callback :commit, :after do
|
122
|
-
action = [:create, :update, :destroy].map {|a| a if
|
156
|
+
action = [:create, :update, :destroy].map {|a| a if transaction_include_any_action?([a]) }.compact.first
|
123
157
|
params = self.serializable_hash(options).delete_if {|key| (['created_at', 'updated_at'] + excluded).include? key}
|
124
158
|
Insque.broadcast :"#{self.class.to_s.underscore}_#{action}", params
|
125
159
|
end
|
data/lib/tasks/insque.rake
CHANGED
metadata
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: insque
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gropher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.2'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 2.2.2
|
@@ -21,6 +24,9 @@ dependencies:
|
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.2'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 2.2.2
|
@@ -46,7 +52,8 @@ files:
|
|
46
52
|
- lib/insque/version.rb
|
47
53
|
- lib/tasks/insque.rake
|
48
54
|
homepage: https://github.com/Gropher/Insque
|
49
|
-
licenses:
|
55
|
+
licenses:
|
56
|
+
- MIT
|
50
57
|
metadata: {}
|
51
58
|
post_install_message:
|
52
59
|
rdoc_options: []
|
@@ -67,7 +74,5 @@ rubyforge_project:
|
|
67
74
|
rubygems_version: 2.5.1
|
68
75
|
signing_key:
|
69
76
|
specification_version: 4
|
70
|
-
summary:
|
71
|
-
Faster and simplier alternative to Resque.
|
77
|
+
summary: Redis-based multi-threaded queue
|
72
78
|
test_files: []
|
73
|
-
has_rdoc:
|