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.
- data/lib/resque/heartbeat.rb +70 -0
- data/lib/resque_heartbeat/version.rb +3 -0
- data/lib/resque_heartbeat.rb +1 -0
- metadata +49 -0
@@ -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 @@
|
|
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: []
|