Class: Rapns::Daemon::AppRunner
- Inherits:
-
Object
- Object
- Rapns::Daemon::AppRunner
show all
- Defined in:
- lib/rapns/daemon/app_runner.rb
Class Attribute Summary collapse
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(app) ⇒ AppRunner
Returns a new instance of AppRunner.
64
65
66
|
# File 'lib/rapns/daemon/app_runner.rb', line 64
def initialize(app)
@app = app
end
|
Class Attribute Details
.runners ⇒ Object
Returns the value of attribute runners.
5
6
7
|
# File 'lib/rapns/daemon/app_runner.rb', line 5
def runners
@runners
end
|
Instance Attribute Details
#app ⇒ Object
Returns the value of attribute app.
62
63
64
|
# File 'lib/rapns/daemon/app_runner.rb', line 62
def app
@app
end
|
Class Method Details
.debug ⇒ Object
50
51
52
|
# File 'lib/rapns/daemon/app_runner.rb', line 50
def self.debug
runners.values.map(&:debug)
end
|
.enqueue(notification) ⇒ Object
10
11
12
13
14
15
16
|
# File 'lib/rapns/daemon/app_runner.rb', line 10
def self.enqueue(notification)
if app = runners[notification.app_id]
app.enqueue(notification)
else
Rapns.logger.error("No such app '#{notification.app_id}' for notification #{notification.id}.")
end
end
|
.idle ⇒ Object
54
55
56
|
# File 'lib/rapns/daemon/app_runner.rb', line 54
def self.idle
runners.values.select(&:idle?)
end
|
.new_runner(app) ⇒ Object
40
41
42
43
|
# File 'lib/rapns/daemon/app_runner.rb', line 40
def self.new_runner(app)
type = app.class.parent.name.demodulize
"Rapns::Daemon::#{type}::AppRunner".constantize.new(app)
end
|
.stop ⇒ Object
45
46
47
48
|
# File 'lib/rapns/daemon/app_runner.rb', line 45
def self.stop
runners.values.map(&:stop)
runners.clear
end
|
.sync ⇒ Object
18
19
20
21
22
23
|
# File 'lib/rapns/daemon/app_runner.rb', line 18
def self.sync
apps = Rapns::App.all
apps.each { |app| sync_app(app) }
removed = runners.keys - apps.map(&:id)
removed.each { |app_id| runners.delete(app_id).stop }
end
|
.sync_app(app) ⇒ Object
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/rapns/daemon/app_runner.rb', line 25
def self.sync_app(app)
if runners[app.id]
runners[app.id].sync(app)
else
runner = new_runner(app)
begin
runner.start
runners[app.id] = runner
rescue StandardError => e
Rapns.logger.error("[#{app.name}] Exception raised during startup. Notifications will not be delivered for this app.")
Rapns.logger.error(e)
end
end
end
|
.wait ⇒ Object
58
59
60
|
# File 'lib/rapns/daemon/app_runner.rb', line 58
def self.wait
sleep 0.1 while !runners.values.all?(&:idle?)
end
|
Instance Method Details
#debug ⇒ Object
111
112
113
114
115
116
117
118
119
|
# File 'lib/rapns/daemon/app_runner.rb', line 111
def debug
Rapns.logger.info <<-EOS
#{@app.name}:
handlers: #{num_handlers}
queued: #{queue_size}
idle: #{idle?}
EOS
end
|
#decrement_handlers ⇒ Object
103
104
105
|
# File 'lib/rapns/daemon/app_runner.rb', line 103
def decrement_handlers
handlers.pop.stop
end
|
#enqueue(notification) ⇒ Object
86
87
88
|
# File 'lib/rapns/daemon/app_runner.rb', line 86
def enqueue(notification)
queue.push(notification)
end
|
#idle? ⇒ Boolean
121
122
123
|
# File 'lib/rapns/daemon/app_runner.rb', line 121
def idle?
queue.notifications_processed?
end
|
#increment_handlers ⇒ Object
107
108
109
|
# File 'lib/rapns/daemon/app_runner.rb', line 107
def increment_handlers
handlers << start_handler
end
|
#num_handlers ⇒ Object
129
130
131
|
# File 'lib/rapns/daemon/app_runner.rb', line 129
def num_handlers
handlers.size
end
|
#queue_size ⇒ Object
125
126
127
|
# File 'lib/rapns/daemon/app_runner.rb', line 125
def queue_size
queue.size
end
|
#start ⇒ Object
74
75
76
77
78
|
# File 'lib/rapns/daemon/app_runner.rb', line 74
def start
app.connections.times { handlers << start_handler }
started
Rapns.logger.info("[#{app.name}] Started, #{handlers_str}.")
end
|
#started ⇒ Object
68
69
|
# File 'lib/rapns/daemon/app_runner.rb', line 68
def started
end
|
#stop ⇒ Object
80
81
82
83
84
|
# File 'lib/rapns/daemon/app_runner.rb', line 80
def stop
handlers.map(&:stop)
stopped
handlers.clear
end
|
#stopped ⇒ Object
71
72
|
# File 'lib/rapns/daemon/app_runner.rb', line 71
def stopped
end
|
#sync(app) ⇒ Object
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/rapns/daemon/app_runner.rb', line 90
def sync(app)
@app = app
diff = handlers.size - app.connections
return if diff == 0
if diff > 0
diff.times { decrement_handlers }
Rapns.logger.info("[#{app.name}] Stopped #{handlers_str(diff)}. #{handlers_str} remaining.")
else
diff.abs.times { increment_handlers }
Rapns.logger.info("[#{app.name}] Started #{handlers_str(diff)}. #{handlers_str} remaining.")
end
end
|