insque 0.4.3 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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: