resque-admin-scheduler 1.0.2 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/migrate_to_timestamps_set.rb +16 -0
- data/exe/resque-scheduler +2 -2
- data/lib/resque/scheduler/cli.rb +6 -6
- data/lib/resque/scheduler/delaying_extensions.rb +14 -14
- data/lib/resque/scheduler/env.rb +7 -7
- data/lib/resque/scheduler/lock.rb +1 -1
- data/lib/resque/scheduler/locking.rb +7 -7
- data/lib/resque/scheduler/logger_builder.rb +4 -4
- data/lib/resque/scheduler/scheduling_extensions.rb +4 -4
- data/lib/resque/scheduler/server/views/delayed.erb +4 -4
- data/lib/resque/scheduler/server/views/search.erb +1 -1
- data/lib/resque/scheduler/server.rb +37 -37
- data/lib/resque/scheduler/signal_handling.rb +1 -1
- data/lib/resque/scheduler/tasks.rb +6 -6
- data/lib/resque/scheduler/util.rb +4 -4
- data/lib/resque/scheduler_admin/cli.rb +147 -0
- data/lib/resque/scheduler_admin/delaying_extensions.rb +324 -0
- data/lib/resque/scheduler_admin/env.rb +89 -0
- data/lib/resque/scheduler_admin/lock.rb +4 -0
- data/lib/resque/scheduler_admin/locking.rb +104 -0
- data/lib/resque/scheduler_admin/logger_builder.rb +72 -0
- data/lib/resque/scheduler_admin/scheduling_extensions.rb +141 -0
- data/lib/resque/scheduler_admin/server/views/delayed.erb +63 -0
- data/lib/resque/scheduler_admin/server/views/search.erb +72 -0
- data/lib/resque/scheduler_admin/signal_handling.rb +40 -0
- data/lib/resque/scheduler_admin/tasks.rb +25 -0
- data/lib/resque/scheduler_admin/util.rb +39 -0
- data/lib/resque-admin-scheduler.rb +4 -0
- data/lib/resque_admin/scheduler/cli.rb +147 -0
- data/lib/{resque → resque_admin}/scheduler/configuration.rb +1 -1
- data/lib/resque_admin/scheduler/delaying_extensions.rb +324 -0
- data/lib/resque_admin/scheduler/env.rb +89 -0
- data/lib/{resque → resque_admin}/scheduler/extension.rb +1 -1
- data/lib/{resque → resque_admin}/scheduler/failure_handler.rb +2 -2
- data/lib/{resque → resque_admin}/scheduler/lock/base.rb +3 -3
- data/lib/{resque → resque_admin}/scheduler/lock/basic.rb +4 -4
- data/lib/{resque → resque_admin}/scheduler/lock/resilient.rb +4 -4
- data/lib/resque_admin/scheduler/lock.rb +4 -0
- data/lib/resque_admin/scheduler/locking.rb +104 -0
- data/lib/resque_admin/scheduler/logger_builder.rb +72 -0
- data/lib/{resque → resque_admin}/scheduler/plugin.rb +1 -1
- data/lib/resque_admin/scheduler/scheduling_extensions.rb +141 -0
- data/lib/resque_admin/scheduler/server/views/delayed.erb +63 -0
- data/lib/{resque → resque_admin}/scheduler/server/views/delayed_schedules.erb +0 -0
- data/lib/{resque → resque_admin}/scheduler/server/views/delayed_timestamp.erb +2 -2
- data/lib/{resque → resque_admin}/scheduler/server/views/requeue-params.erb +0 -0
- data/lib/{resque → resque_admin}/scheduler/server/views/scheduler.erb +7 -7
- data/lib/resque_admin/scheduler/server/views/search.erb +72 -0
- data/lib/{resque → resque_admin}/scheduler/server/views/search_form.erb +0 -0
- data/lib/resque_admin/scheduler/server.rb +268 -0
- data/lib/resque_admin/scheduler/signal_handling.rb +40 -0
- data/lib/resque_admin/scheduler/tasks.rb +25 -0
- data/lib/resque_admin/scheduler/util.rb +39 -0
- data/lib/{resque → resque_admin}/scheduler/version.rb +2 -2
- data/lib/{resque → resque_admin}/scheduler.rb +44 -44
- data/tasks/resque_admin_scheduler.rake +2 -0
- metadata +47 -85
- data/AUTHORS.md +0 -81
- data/CHANGELOG.md +0 -456
- data/CODE_OF_CONDUCT.md +0 -74
- data/CONTRIBUTING.md +0 -6
- data/Gemfile +0 -4
- data/LICENSE +0 -23
- data/README.md +0 -691
- data/Rakefile +0 -21
- data/lib/resque-scheduler.rb +0 -4
- data/resque-scheduler.gemspec +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 480fe9565b4e589d1af66f650d235c2cb1d17db5
|
4
|
+
data.tar.gz: 4ec0e5445bcb1b6cbb404ed1fe0d4e17c132cd4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46cc8ebbab4bae754421bd24b5a5e02e5b9762b3851ba38c9f2f543203907739c28fc0730d28e558f326c05a150f3c584cfd421116a6975274aabf0d5b1040cd
|
7
|
+
data.tar.gz: bd36ba04d100a60dea2599222b5a937aabe8dcc4c59351193ac8f0bcff3e0b74406d03f8b4eee35f5c67e18e4fdbbb4709480ca7c86c544b008b0eb48c528cf6
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
require 'resque_admin'
|
5
|
+
|
6
|
+
if ARGV.size != 1
|
7
|
+
puts 'migrate_to_timestamps_set.rb <redis-host:redis-port>'
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
|
11
|
+
ResqueAdmin.redis = ARGV[0]
|
12
|
+
redis = ResqueAdmin.redis
|
13
|
+
Array(redis.keys('delayed:*')).each do |key|
|
14
|
+
jobs = redis.lrange(key, 0, -1)
|
15
|
+
jobs.each { |job| redis.sadd("timestamps:#{job}", key) }
|
16
|
+
end
|
data/exe/resque-scheduler
CHANGED
data/lib/resque/scheduler/cli.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'optparse'
|
4
4
|
|
5
|
-
module
|
5
|
+
module ResqueAdmin
|
6
6
|
module Scheduler
|
7
7
|
CLI_OPTIONS_ENV_MAPPING = {
|
8
8
|
app_name: 'APP_NAME',
|
@@ -20,9 +20,9 @@ module Resque
|
|
20
20
|
|
21
21
|
class Cli
|
22
22
|
BANNER = <<-EOF.gsub(/ {6}/, '')
|
23
|
-
Usage:
|
23
|
+
Usage: resque_admin-scheduler [options]
|
24
24
|
|
25
|
-
Runs a
|
25
|
+
Runs a resque_admin scheduler process directly (rather than via rake).
|
26
26
|
|
27
27
|
EOF
|
28
28
|
OPTIONS = [
|
@@ -114,7 +114,7 @@ module Resque
|
|
114
114
|
end
|
115
115
|
|
116
116
|
def run_forever
|
117
|
-
|
117
|
+
ResqueAdmin::Scheduler.run
|
118
118
|
end
|
119
119
|
|
120
120
|
private
|
@@ -122,13 +122,13 @@ module Resque
|
|
122
122
|
attr_reader :argv, :env
|
123
123
|
|
124
124
|
def runtime_env
|
125
|
-
@runtime_env ||=
|
125
|
+
@runtime_env ||= ResqueAdmin::Scheduler::Env.new(options)
|
126
126
|
end
|
127
127
|
|
128
128
|
def option_parser
|
129
129
|
OptionParser.new do |opts|
|
130
130
|
opts.banner = BANNER
|
131
|
-
opts.version =
|
131
|
+
opts.version = ResqueAdmin::Scheduler::VERSION
|
132
132
|
OPTIONS.each do |opt|
|
133
133
|
opts.on(*opt[:args], &opt[:callback].call(options))
|
134
134
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# vim:fileencoding=utf-8
|
2
|
-
require '
|
2
|
+
require 'resque_admin'
|
3
3
|
require_relative 'plugin'
|
4
4
|
require_relative '../scheduler'
|
5
5
|
|
6
|
-
module
|
6
|
+
module ResqueAdmin
|
7
7
|
module Scheduler
|
8
8
|
module DelayingExtensions
|
9
9
|
# This method is nearly identical to +enqueue+ only it also
|
@@ -19,21 +19,21 @@ module Resque
|
|
19
19
|
|
20
20
|
# Identical to +enqueue_at+, except you can also specify
|
21
21
|
# a queue in which the job will be placed after the
|
22
|
-
# timestamp has passed. It respects
|
22
|
+
# timestamp has passed. It respects ResqueAdmin.inline option, by
|
23
23
|
# creating the job right away instead of adding to the queue.
|
24
24
|
def enqueue_at_with_queue(queue, timestamp, klass, *args)
|
25
25
|
return false unless plugin.run_before_schedule_hooks(klass, *args)
|
26
26
|
|
27
|
-
if
|
28
|
-
# Just create the job and let
|
27
|
+
if ResqueAdmin.inline? || timestamp.to_i < Time.now.to_i
|
28
|
+
# Just create the job and let resque_admin perform it right away with
|
29
29
|
# inline. If the class is a custom job class, call self#scheduled
|
30
30
|
# on it. This allows you to do things like
|
31
|
-
#
|
32
|
-
# Otherwise, pass off to
|
31
|
+
# ResqueAdmin.enqueue_at(timestamp, CustomJobClass, :opt1 => val1).
|
32
|
+
# Otherwise, pass off to ResqueAdmin.
|
33
33
|
if klass.respond_to?(:scheduled)
|
34
34
|
klass.scheduled(queue, klass.to_s, *args)
|
35
35
|
else
|
36
|
-
|
36
|
+
ResqueAdmin::Job.create(queue, klass, *args)
|
37
37
|
end
|
38
38
|
else
|
39
39
|
delayed_push(timestamp, job_to_hash_with_queue(queue, klass, args))
|
@@ -147,7 +147,7 @@ module Resque
|
|
147
147
|
def enqueue_delayed(klass, *args)
|
148
148
|
hash = job_to_hash(klass, args)
|
149
149
|
remove_delayed(klass, *args).times do
|
150
|
-
|
150
|
+
ResqueAdmin::Scheduler.enqueue_from_config(hash)
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
@@ -210,7 +210,7 @@ module Resque
|
|
210
210
|
# O(N) where N is the number of jobs scheduled to fire at the given
|
211
211
|
# timestamp
|
212
212
|
def remove_delayed_job_from_timestamp(timestamp, klass, *args)
|
213
|
-
return 0 if
|
213
|
+
return 0 if ResqueAdmin.inline?
|
214
214
|
|
215
215
|
key = "delayed:#{timestamp.to_i}"
|
216
216
|
encoded_job = encode(job_to_hash(klass, args))
|
@@ -232,8 +232,8 @@ module Resque
|
|
232
232
|
|
233
233
|
# Discover if a job has been delayed.
|
234
234
|
# Examples
|
235
|
-
#
|
236
|
-
#
|
235
|
+
# ResqueAdmin.delayed?(MyJob)
|
236
|
+
# ResqueAdmin.delayed?(MyJob, id: 1)
|
237
237
|
# Returns true if the job has been delayed
|
238
238
|
def delayed?(klass, *args)
|
239
239
|
!scheduled_at(klass, *args).empty?
|
@@ -266,7 +266,7 @@ module Resque
|
|
266
266
|
end
|
267
267
|
|
268
268
|
def remove_delayed_job(encoded_job)
|
269
|
-
return 0 if
|
269
|
+
return 0 if ResqueAdmin.inline?
|
270
270
|
|
271
271
|
timestamps = redis.smembers("timestamps:#{encoded_job}")
|
272
272
|
|
@@ -317,7 +317,7 @@ module Resque
|
|
317
317
|
end
|
318
318
|
|
319
319
|
def plugin
|
320
|
-
|
320
|
+
ResqueAdmin::Scheduler::Plugin
|
321
321
|
end
|
322
322
|
end
|
323
323
|
end
|
data/lib/resque/scheduler/env.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'English' # $PROCESS_ID
|
4
4
|
|
5
|
-
module
|
5
|
+
module ResqueAdmin
|
6
6
|
module Scheduler
|
7
7
|
class Env
|
8
8
|
def initialize(options)
|
@@ -11,8 +11,8 @@ module Resque
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def setup
|
14
|
-
require '
|
15
|
-
require '
|
14
|
+
require 'resque_admin'
|
15
|
+
require 'resque_admin/scheduler'
|
16
16
|
|
17
17
|
setup_backgrounding
|
18
18
|
setup_pid_file
|
@@ -32,7 +32,7 @@ module Resque
|
|
32
32
|
|
33
33
|
# Need to set this here for conditional Process.daemon redirect of
|
34
34
|
# stderr/stdout to /dev/null
|
35
|
-
|
35
|
+
ResqueAdmin::Scheduler.quiet = if options.key?(:quiet)
|
36
36
|
!!options[:quiet]
|
37
37
|
else
|
38
38
|
true
|
@@ -42,8 +42,8 @@ module Resque
|
|
42
42
|
abort 'background option is set, which requires ruby >= 1.9'
|
43
43
|
end
|
44
44
|
|
45
|
-
Process.daemon(true, !
|
46
|
-
|
45
|
+
Process.daemon(true, !ResqueAdmin::Scheduler.quiet)
|
46
|
+
ResqueAdmin.redis.client.reconnect
|
47
47
|
end
|
48
48
|
|
49
49
|
def setup_pid_file
|
@@ -59,7 +59,7 @@ module Resque
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def setup_scheduler_configuration
|
62
|
-
|
62
|
+
ResqueAdmin::Scheduler.configure do |c|
|
63
63
|
c.app_name = options[:app_name] if options.key?(:app_name)
|
64
64
|
|
65
65
|
c.dynamic = !!options[:dynamic] if options.key?(:dynamic)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# ### Locking the scheduler process
|
4
4
|
#
|
5
|
-
# There are two places in
|
5
|
+
# There are two places in resque_admin-scheduler that need to be synchonized in order
|
6
6
|
# to be able to run redundant scheduler processes while ensuring jobs don't get
|
7
7
|
# queued multiple times when the master process changes.
|
8
8
|
#
|
@@ -23,7 +23,7 @@
|
|
23
23
|
# should remain the master as long as it can rather than a simple SETNX which
|
24
24
|
# would result in the master roll being passed around frequently.
|
25
25
|
#
|
26
|
-
# Locking Scheme: Each
|
26
|
+
# Locking Scheme: Each resque_admin-scheduler process attempts to get the master lock
|
27
27
|
# via SETNX. Once obtained, it sets the expiration for 3 minutes
|
28
28
|
# (configurable). The master process continually updates the timeout on the
|
29
29
|
# lock key to be 3 minutes in the future in it's loop(s) (see `run`) and when
|
@@ -51,7 +51,7 @@
|
|
51
51
|
|
52
52
|
require_relative 'lock'
|
53
53
|
|
54
|
-
module
|
54
|
+
module ResqueAdmin
|
55
55
|
module Scheduler
|
56
56
|
module Locking
|
57
57
|
def master_lock
|
@@ -84,20 +84,20 @@ module Resque
|
|
84
84
|
|
85
85
|
def build_master_lock
|
86
86
|
if supports_lua?
|
87
|
-
|
87
|
+
ResqueAdmin::Scheduler::Lock::Resilient.new(master_lock_key)
|
88
88
|
else
|
89
|
-
|
89
|
+
ResqueAdmin::Scheduler::Lock::Basic.new(master_lock_key)
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
93
|
def master_lock_key
|
94
94
|
lock_prefix = ENV['RESQUE_SCHEDULER_MASTER_LOCK_PREFIX'] || ''
|
95
95
|
lock_prefix += ':' if lock_prefix != ''
|
96
|
-
"#{
|
96
|
+
"#{ResqueAdmin.redis.namespace}:#{lock_prefix}resque_scheduler_master_lock"
|
97
97
|
end
|
98
98
|
|
99
99
|
def redis_master_version
|
100
|
-
|
100
|
+
ResqueAdmin.redis.info['redis_version'].to_f
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
require 'mono_logger'
|
4
4
|
|
5
|
-
module
|
5
|
+
module ResqueAdmin
|
6
6
|
module Scheduler
|
7
7
|
# Just builds a logger, with specified verbosity and destination.
|
8
8
|
# The simplest example:
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# ResqueAdmin::Scheduler::LoggerBuilder.new.build
|
11
11
|
class LoggerBuilder
|
12
12
|
# Initializes new instance of the builder
|
13
13
|
#
|
@@ -51,7 +51,7 @@ module Resque
|
|
51
51
|
|
52
52
|
def text_formatter
|
53
53
|
proc do |severity, datetime, _progname, msg|
|
54
|
-
"
|
54
|
+
"resque_admin-scheduler: [#{severity}] #{datetime.iso8601}: #{msg}\n"
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -59,7 +59,7 @@ module Resque
|
|
59
59
|
proc do |severity, datetime, progname, msg|
|
60
60
|
require 'json'
|
61
61
|
JSON.dump(
|
62
|
-
name: '
|
62
|
+
name: 'resque_admin-scheduler',
|
63
63
|
progname: progname,
|
64
64
|
level: severity,
|
65
65
|
timestamp: datetime.iso8601,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# vim:fileencoding=utf-8
|
2
2
|
|
3
|
-
module
|
3
|
+
module ResqueAdmin
|
4
4
|
module Scheduler
|
5
5
|
module SchedulingExtensions
|
6
6
|
# Accepts a new schedule configuration of the form:
|
@@ -19,7 +19,7 @@ module Resque
|
|
19
19
|
# Hash keys can be anything and are used to describe and reference
|
20
20
|
# the scheduled job. If the "class" argument is missing, the key
|
21
21
|
# is used implicitly as "class" argument - in the "MakeTea" example,
|
22
|
-
# "MakeTea" is used both as job name and
|
22
|
+
# "MakeTea" is used both as job name and resque_admin worker class.
|
23
23
|
#
|
24
24
|
# Any jobs that were in the old schedule, but are not
|
25
25
|
# present in the new schedule, will be removed.
|
@@ -30,7 +30,7 @@ module Resque
|
|
30
30
|
# usage for valid syntax. If :cron is present it will take precedence
|
31
31
|
# over :every.
|
32
32
|
#
|
33
|
-
# :class must be a
|
33
|
+
# :class must be a resque_admin worker class. If it is missing, the job name
|
34
34
|
# (hash key) will be used as :class.
|
35
35
|
#
|
36
36
|
# :args can be any yaml which will be converted to a ruby literal and
|
@@ -76,7 +76,7 @@ module Resque
|
|
76
76
|
# Note: values for class and custom_job_class need to be strings,
|
77
77
|
# not constants.
|
78
78
|
#
|
79
|
-
#
|
79
|
+
# ResqueAdmin.set_schedule('some_job', {:class => 'SomeJob',
|
80
80
|
# :every => '15mins',
|
81
81
|
# :queue => 'high',
|
82
82
|
# :args => '/tmp/poop'})
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<h1>Delayed Jobs</h1>
|
2
|
-
<%- size =
|
2
|
+
<%- size = resque_admin.delayed_queue_schedule_size %>
|
3
3
|
|
4
4
|
<%= scheduler_view :search_form, layout: false %>
|
5
5
|
|
@@ -25,7 +25,7 @@
|
|
25
25
|
<th>Args</th>
|
26
26
|
<th>All schedules</th>
|
27
27
|
</tr>
|
28
|
-
<%
|
28
|
+
<% resque_admin.delayed_queue_peek(start, 20).each do |timestamp| %>
|
29
29
|
<tr>
|
30
30
|
<td>
|
31
31
|
<form action="<%= u "/delayed/queue_now" %>" method="post">
|
@@ -34,8 +34,8 @@
|
|
34
34
|
</form>
|
35
35
|
</td>
|
36
36
|
<td><a href="<%= u "delayed/#{timestamp}" %>"><%= format_time(Time.at(timestamp)) %></a></td>
|
37
|
-
<td><%= delayed_timestamp_size =
|
38
|
-
<% job =
|
37
|
+
<td><%= delayed_timestamp_size = resque_admin.delayed_timestamp_size(timestamp) %></td>
|
38
|
+
<% job = resque_admin.delayed_timestamp_peek(timestamp, 0, 1).first %>
|
39
39
|
<td>
|
40
40
|
<% if job && delayed_timestamp_size == 1 %>
|
41
41
|
<%= h(job['class']) %>
|
@@ -23,7 +23,7 @@
|
|
23
23
|
<form action="<%= u "/delayed/cancel_now" %>" method="post">
|
24
24
|
<input type="hidden" name="timestamp" value="<%= job['timestamp'].to_i %>">
|
25
25
|
<input type="hidden" name="klass" value="<%= job['class'] %>">
|
26
|
-
<input type="hidden" name="args" value="<%= h(
|
26
|
+
<input type="hidden" name="args" value="<%= h(ResqueAdmin.encode job['args']) %>">
|
27
27
|
<input type="submit" value="Cancel Job">
|
28
28
|
</form>
|
29
29
|
</td>
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# vim:fileencoding=utf-8
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'resque_admin-scheduler'
|
3
|
+
require 'resque_admin/server'
|
4
4
|
require 'tilt/erb'
|
5
5
|
require 'json'
|
6
6
|
|
7
|
-
# Extend
|
8
|
-
module
|
7
|
+
# Extend ResqueAdmin::Server to add tabs
|
8
|
+
module ResqueAdmin
|
9
9
|
module Scheduler
|
10
10
|
module Server
|
11
11
|
TIMESTAMP_FORMAT = '%Y-%m-%d %H:%M:%S %z'.freeze
|
12
12
|
|
13
|
-
unless defined?(::
|
13
|
+
unless defined?(::ResqueAdmin::Scheduler::Server::VIEW_PATH)
|
14
14
|
VIEW_PATH = File.join(File.dirname(__FILE__), 'server', 'views')
|
15
15
|
end
|
16
16
|
|
@@ -37,25 +37,25 @@ module Resque
|
|
37
37
|
|
38
38
|
module ServerMethods
|
39
39
|
def schedule
|
40
|
-
|
40
|
+
ResqueAdmin.reload_schedule! if ResqueAdmin::Scheduler.dynamic
|
41
41
|
erb scheduler_template('scheduler')
|
42
42
|
end
|
43
43
|
|
44
44
|
def schedule_requeue
|
45
45
|
@job_name = params['job_name'] || params[:job_name]
|
46
|
-
config =
|
46
|
+
config = ResqueAdmin.schedule[@job_name]
|
47
47
|
@parameters = config['parameters'] || config[:parameters]
|
48
48
|
if @parameters
|
49
49
|
erb scheduler_template('requeue-params')
|
50
50
|
else
|
51
|
-
|
51
|
+
ResqueAdmin::Scheduler.enqueue_from_config(config)
|
52
52
|
redirect u('/overview')
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
def schedule_requeue_with_params
|
57
57
|
job_name = params['job_name'] || params[:job_name]
|
58
|
-
config =
|
58
|
+
config = ResqueAdmin.schedule[job_name]
|
59
59
|
# Build args hash from post data (removing the job name)
|
60
60
|
submitted_args = params.reject do |key, _value|
|
61
61
|
key == 'job_name' || key == :job_name
|
@@ -66,16 +66,16 @@ module Resque
|
|
66
66
|
config_args = config['args'] || config[:args] || {}
|
67
67
|
config_args = config_args.merge(submitted_args)
|
68
68
|
|
69
|
-
# Insert the args hash into config and queue the
|
69
|
+
# Insert the args hash into config and queue the resque_admin job
|
70
70
|
config = config.merge('args' => config_args)
|
71
|
-
|
71
|
+
ResqueAdmin::Scheduler.enqueue_from_config(config)
|
72
72
|
redirect u('/overview')
|
73
73
|
end
|
74
74
|
|
75
75
|
def delete_schedule
|
76
|
-
if
|
76
|
+
if ResqueAdmin::Scheduler.dynamic
|
77
77
|
job_name = params['job_name'] || params[:job_name]
|
78
|
-
|
78
|
+
ResqueAdmin.remove_schedule(job_name)
|
79
79
|
end
|
80
80
|
redirect u('/schedule')
|
81
81
|
end
|
@@ -86,9 +86,9 @@ module Resque
|
|
86
86
|
|
87
87
|
def delayed_jobs_klass
|
88
88
|
begin
|
89
|
-
klass =
|
89
|
+
klass = ResqueAdmin::Scheduler::Util.constantize(params[:klass])
|
90
90
|
@args = JSON.load(URI.decode(params[:args]))
|
91
|
-
@timestamps =
|
91
|
+
@timestamps = ResqueAdmin.scheduled_at(klass, *@args)
|
92
92
|
rescue
|
93
93
|
@timestamps = []
|
94
94
|
end
|
@@ -108,11 +108,11 @@ module Resque
|
|
108
108
|
def delayed_queue_now
|
109
109
|
timestamp = params['timestamp'].to_i
|
110
110
|
formatted_time = Time.at(timestamp).strftime(
|
111
|
-
::
|
111
|
+
::ResqueAdmin::Scheduler::Server::TIMESTAMP_FORMAT
|
112
112
|
)
|
113
113
|
|
114
114
|
if timestamp > 0
|
115
|
-
unless
|
115
|
+
unless ResqueAdmin::Scheduler.enqueue_next_item(timestamp)
|
116
116
|
@error_message = "Unable to remove item at #{formatted_time}"
|
117
117
|
end
|
118
118
|
else
|
@@ -123,22 +123,22 @@ module Resque
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def delayed_cancel_now
|
126
|
-
klass =
|
126
|
+
klass = ResqueAdmin::Scheduler::Util.constantize(params['klass'])
|
127
127
|
timestamp = params['timestamp']
|
128
|
-
args =
|
129
|
-
|
128
|
+
args = ResqueAdmin.decode params['args']
|
129
|
+
ResqueAdmin.remove_delayed_job_from_timestamp(timestamp, klass, *args)
|
130
130
|
redirect u('/delayed')
|
131
131
|
end
|
132
132
|
|
133
133
|
def delayed_clear
|
134
|
-
|
134
|
+
ResqueAdmin.reset_delayed_queue
|
135
135
|
redirect u('delayed')
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
139
|
module HelperMethods
|
140
140
|
def format_time(t)
|
141
|
-
t.strftime(::
|
141
|
+
t.strftime(::ResqueAdmin::Scheduler::Server::TIMESTAMP_FORMAT)
|
142
142
|
end
|
143
143
|
|
144
144
|
def show_job_arguments(args)
|
@@ -146,8 +146,8 @@ module Resque
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def queue_from_class_name(class_name)
|
149
|
-
|
150
|
-
|
149
|
+
ResqueAdmin.queue_from_class(
|
150
|
+
ResqueAdmin::Scheduler::Util.constantize(class_name)
|
151
151
|
)
|
152
152
|
end
|
153
153
|
|
@@ -161,8 +161,8 @@ module Resque
|
|
161
161
|
j.merge!('where_at' => 'delayed')
|
162
162
|
end
|
163
163
|
|
164
|
-
|
165
|
-
queued =
|
164
|
+
ResqueAdmin.queues.each do |queue|
|
165
|
+
queued = ResqueAdmin.peek(queue, 0, ResqueAdmin.size(queue))
|
166
166
|
queued = [queued] unless queued.is_a?(Array)
|
167
167
|
results += queued.select do |j|
|
168
168
|
j['class'].downcase.include?(worker) &&
|
@@ -212,11 +212,11 @@ module Resque
|
|
212
212
|
|
213
213
|
def scheduled_in_this_env?(name)
|
214
214
|
return true if rails_env(name).nil?
|
215
|
-
rails_env(name).split(/[\s,]+/).include?(
|
215
|
+
rails_env(name).split(/[\s,]+/).include?(ResqueAdmin::Scheduler.env)
|
216
216
|
end
|
217
217
|
|
218
218
|
def rails_env(name)
|
219
|
-
|
219
|
+
ResqueAdmin.schedule[name]['rails_env'] || ResqueAdmin.schedule[name]['env']
|
220
220
|
end
|
221
221
|
|
222
222
|
def scheduler_view(filename, options = {}, locals = {})
|
@@ -228,7 +228,7 @@ module Resque
|
|
228
228
|
|
229
229
|
def working_jobs_for_worker(worker)
|
230
230
|
[].tap do |results|
|
231
|
-
working = [*
|
231
|
+
working = [*ResqueAdmin.working]
|
232
232
|
work = working.select do |w|
|
233
233
|
w.job && w.job['payload'] &&
|
234
234
|
w.job['payload']['class'].downcase.include?(worker)
|
@@ -245,10 +245,10 @@ module Resque
|
|
245
245
|
|
246
246
|
def delayed_jobs_for_worker(_worker)
|
247
247
|
[].tap do |dels|
|
248
|
-
schedule_size =
|
249
|
-
|
250
|
-
|
251
|
-
d, 0,
|
248
|
+
schedule_size = ResqueAdmin.delayed_queue_schedule_size
|
249
|
+
ResqueAdmin.delayed_queue_peek(0, schedule_size).each do |d|
|
250
|
+
ResqueAdmin.delayed_timestamp_peek(
|
251
|
+
d, 0, ResqueAdmin.delayed_timestamp_size(d)
|
252
252
|
).each do |j|
|
253
253
|
dels << j.merge!('timestamp' => d)
|
254
254
|
end
|
@@ -260,9 +260,9 @@ module Resque
|
|
260
260
|
end
|
261
261
|
end
|
262
262
|
|
263
|
-
|
264
|
-
|
263
|
+
ResqueAdmin::Server.tabs << 'Schedule'
|
264
|
+
ResqueAdmin::Server.tabs << 'Delayed'
|
265
265
|
|
266
|
-
|
267
|
-
include
|
266
|
+
ResqueAdmin::Server.class_eval do
|
267
|
+
include ResqueAdmin::Scheduler::Server
|
268
268
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# vim:fileencoding=utf-8
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'resque_admin/tasks'
|
4
|
+
require 'resque_admin-scheduler'
|
5
5
|
|
6
|
-
namespace :
|
6
|
+
namespace :resque_admin do
|
7
7
|
task :setup
|
8
8
|
|
9
9
|
def scheduler_cli
|
10
|
-
@scheduler_cli ||=
|
10
|
+
@scheduler_cli ||= ResqueAdmin::Scheduler::Cli.new(
|
11
11
|
%W(#{ENV['RESQUE_SCHEDULER_OPTIONS']})
|
12
12
|
)
|
13
13
|
end
|
14
14
|
|
15
|
-
desc 'Start
|
15
|
+
desc 'Start ResqueAdmin Scheduler'
|
16
16
|
task scheduler: :scheduler_setup do
|
17
17
|
scheduler_cli.setup_env
|
18
18
|
scheduler_cli.run_forever
|
@@ -20,6 +20,6 @@ namespace :resque do
|
|
20
20
|
|
21
21
|
task :scheduler_setup do
|
22
22
|
scheduler_cli.parse_options
|
23
|
-
Rake::Task['
|
23
|
+
Rake::Task['resque_admin:setup'].invoke unless scheduler_cli.pre_setup
|
24
24
|
end
|
25
25
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# vim:fileencoding=utf-8
|
2
2
|
|
3
|
-
module
|
3
|
+
module ResqueAdmin
|
4
4
|
module Scheduler
|
5
5
|
class Util
|
6
|
-
# In order to upgrade to
|
7
|
-
# methods, we just added these usefull helpers back to use in
|
6
|
+
# In order to upgrade to resque_admin(1.25) which has deprecated following
|
7
|
+
# methods, we just added these usefull helpers back to use in ResqueAdmin
|
8
8
|
# Scheduler. refer to:
|
9
|
-
# https://github.com/
|
9
|
+
# https://github.com/resque_admin/resque_admin-scheduler/pull/273
|
10
10
|
|
11
11
|
def self.constantize(camel_cased_word)
|
12
12
|
camel_cased_word = camel_cased_word.to_s
|