resque-heartbeat 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,70 @@
1
+ require 'resque'
2
+
3
+ module Resque
4
+ def self.prune_dead_workers
5
+ begin
6
+ Worker.all.each { |worker| worker.prune_if_dead }
7
+ rescue Exception => e
8
+ p e
9
+ end
10
+ end
11
+
12
+ class Worker
13
+ def startup_with_heartbeat
14
+ startup_without_heartbeat
15
+ heart.run
16
+ end
17
+ alias startup_without_heartbeat startup
18
+ alias startup startup_with_heartbeat
19
+
20
+ def heart
21
+ @heart ||= Heart.new(self)
22
+ end
23
+
24
+ def prune_if_dead
25
+ unregister_worker if heart.last_beat_before?(5)
26
+ end
27
+
28
+ class Heart
29
+ attr_reader :worker
30
+
31
+ def initialize(worker)
32
+ @worker = worker
33
+ end
34
+
35
+ def run
36
+ Thread.new { loop { sleep(2) && beat! } }
37
+ end
38
+
39
+ def redis
40
+ @redis && connected? ? @redis : @redis = connect
41
+ end
42
+
43
+ def connect
44
+ # apparently the Redis connection is not thread-safe, so we connect another instance
45
+ # see https://github.com/ezmobius/redis-rb/issues#issue/75
46
+ redis = Redis.connect(:url => Travis.config['redis']['url']).tap { |redis| redis.client.connect }
47
+ Redis::Namespace.new(:resque, :redis => redis)
48
+ end
49
+
50
+ def connected?
51
+ @redis.client.connected?
52
+ end
53
+
54
+ def beat!
55
+ redis.sadd(:workers, worker)
56
+ redis.set("worker:#{worker}:heartbeat", Time.now.to_s)
57
+ rescue Exception => e
58
+ p e
59
+ end
60
+
61
+ def last_beat_before?(seconds)
62
+ Time.parse(last_beat).utc < (Time.now.utc - seconds) rescue true
63
+ end
64
+
65
+ def last_beat
66
+ Resque.redis.get("worker:#{worker}:heartbeat") || worker.started
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,3 @@
1
+ module ResqueHeartbeat
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1 @@
1
+ require 'resque/heartbeat'
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resque-heartbeat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sven Fuchs
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-06-06 00:00:00.000000000 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+ description: ! '[description]'
16
+ email: svenfuchs@artweb-design.de
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/resque/heartbeat.rb
22
+ - lib/resque_heartbeat.rb
23
+ - lib/resque_heartbeat/version.rb
24
+ has_rdoc: true
25
+ homepage: http://github.com/svenfuchs/resque-heartbeat
26
+ licenses: []
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ! '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project: ! '[none]'
45
+ rubygems_version: 1.6.2
46
+ signing_key:
47
+ specification_version: 3
48
+ summary: ! '[summary]'
49
+ test_files: []