resque-heartbeat 0.0.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.
@@ -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: []