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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 70aa885c8cc1912103b4665f966d52be327e708c
4
- data.tar.gz: 2e959689e93d83c06b650707c77133584e91bb4e
3
+ metadata.gz: db352d3e0afe2bfd0243f0e9cd15a905226ae4fe
4
+ data.tar.gz: 9ea0abcc665e264a0c51d1be4a20a9ba3e8d1ce7
5
5
  SHA512:
6
- metadata.gz: 7b8e5e447ef3c36d25dc6ec35039dc9dc1c2c52ae39a84dc88822a13ef3a952843328126334bf2c05dee1d87fd9a7cbfd9d9b5b888b04011e6ebb61d7aac5d40
7
- data.tar.gz: 6a963d0087f28a16ba83fb36a564258bca79a609d2984bdccbb782ebeb920b84c4533ab6c58b623e34c1bcac0af4c3067b5f468535a48ed78aff00b8b6d0310a
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 = "Instant queue. Background processing and message driven communication tool. Faster and simplier alternative to Resque."
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
@@ -1,3 +1,3 @@
1
1
  module Insque
2
- VERSION = "0.4.3"
2
+ VERSION = "0.5.1"
3
3
  end
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 = Redis.new @redis_config
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 = "insque_inbox_#{sender}"
19
- @processing = "insque_processing_#{sender}"
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 'insque_inboxes'
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 = Redis.new @redis_config
42
- redis.select 7
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
- redis.sadd 'insque_inboxes', @inbox
45
- log "#{worker_name} START LISTENING #{@inbox}"
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(@inbox, @processing, 0)
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 @processing, 0, message
91
+ redis.lrem processing, 0, message
58
92
  end
59
93
  end
60
94
 
61
- def self.janitor
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 @processing
97
+ redis.watch processing
67
98
  errors = []
68
99
  restart = []
69
100
  delete = []
70
- redis.lrange(@processing, 0, -1).each do |m|
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 @inbox, m.to_json }
86
- delete.each {|m| r.lrem @processing, 0, m }
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
- private
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 }, :self
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 transaction_include_action?(a) }.compact.first
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
@@ -5,6 +5,8 @@ namespace :insque do
5
5
  threads = []
6
6
  threads << Thread.new() { Insque.listen }
7
7
  threads << Thread.new() { Insque.janitor }
8
+ threads << Thread.new() { Insque.slow_listen }
9
+ threads << Thread.new() { Insque.slow_janitor }
8
10
  threads.each {|t| t.join }
9
11
  end
10
12
 
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.3
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: 2016-09-21 00:00:00.000000000 Z
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: Instant queue. Background processing and message driven communication tool.
71
- Faster and simplier alternative to Resque.
77
+ summary: Redis-based multi-threaded queue
72
78
  test_files: []
73
- has_rdoc: