resque 1.23.0 → 2.6.0

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.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY.md +271 -0
  3. data/README.markdown +454 -484
  4. data/Rakefile +4 -17
  5. data/bin/resque-web +10 -22
  6. data/lib/resque/data_store.rb +335 -0
  7. data/lib/resque/errors.rb +15 -1
  8. data/lib/resque/failure/airbrake.rb +32 -4
  9. data/lib/resque/failure/base.rb +16 -7
  10. data/lib/resque/failure/multiple.rb +26 -8
  11. data/lib/resque/failure/redis.rb +92 -15
  12. data/lib/resque/failure/redis_multi_queue.rb +104 -0
  13. data/lib/resque/failure.rb +62 -32
  14. data/lib/resque/helpers.rb +11 -57
  15. data/lib/resque/job.rb +79 -12
  16. data/lib/resque/log_formatters/quiet_formatter.rb +7 -0
  17. data/lib/resque/log_formatters/verbose_formatter.rb +7 -0
  18. data/lib/resque/log_formatters/very_verbose_formatter.rb +8 -0
  19. data/lib/resque/logging.rb +18 -0
  20. data/lib/resque/plugin.rb +22 -10
  21. data/lib/resque/railtie.rb +10 -0
  22. data/lib/resque/server/public/jquery-3.6.0.min.js +2 -0
  23. data/lib/resque/server/public/jquery.relatize_date.js +4 -4
  24. data/lib/resque/server/public/main.js +3 -0
  25. data/lib/resque/server/public/ranger.js +16 -8
  26. data/lib/resque/server/public/style.css +13 -8
  27. data/lib/resque/server/views/error.erb +1 -1
  28. data/lib/resque/server/views/failed.erb +27 -59
  29. data/lib/resque/server/views/failed_job.erb +50 -0
  30. data/lib/resque/server/views/failed_queues_overview.erb +24 -0
  31. data/lib/resque/server/views/job_class.erb +8 -0
  32. data/lib/resque/server/views/key_sets.erb +2 -4
  33. data/lib/resque/server/views/key_string.erb +1 -1
  34. data/lib/resque/server/views/layout.erb +7 -6
  35. data/lib/resque/server/views/next_more.erb +22 -10
  36. data/lib/resque/server/views/processing.erb +2 -0
  37. data/lib/resque/server/views/queues.erb +22 -13
  38. data/lib/resque/server/views/stats.erb +5 -5
  39. data/lib/resque/server/views/workers.erb +4 -4
  40. data/lib/resque/server/views/working.erb +10 -11
  41. data/lib/resque/server.rb +51 -108
  42. data/lib/resque/server_helper.rb +185 -0
  43. data/lib/resque/stat.rb +19 -7
  44. data/lib/resque/tasks.rb +26 -25
  45. data/lib/resque/thread_signal.rb +24 -0
  46. data/lib/resque/vendor/utf8_util.rb +2 -8
  47. data/lib/resque/version.rb +1 -1
  48. data/lib/resque/web_runner.rb +374 -0
  49. data/lib/resque/worker.rb +487 -163
  50. data/lib/resque.rb +332 -52
  51. data/lib/tasks/redis.rake +11 -11
  52. metadata +169 -149
  53. data/lib/resque/failure/hoptoad.rb +0 -33
  54. data/lib/resque/failure/thoughtbot.rb +0 -33
  55. data/lib/resque/server/public/jquery-1.3.2.min.js +0 -19
  56. data/lib/resque/server/test_helper.rb +0 -19
  57. data/lib/resque/vendor/utf8_util/utf8_util_18.rb +0 -91
  58. data/lib/resque/vendor/utf8_util/utf8_util_19.rb +0 -5
  59. data/test/airbrake_test.rb +0 -27
  60. data/test/hoptoad_test.rb +0 -26
  61. data/test/job_hooks_test.rb +0 -464
  62. data/test/job_plugins_test.rb +0 -230
  63. data/test/plugin_test.rb +0 -116
  64. data/test/redis-test-cluster.conf +0 -115
  65. data/test/redis-test.conf +0 -115
  66. data/test/resque-web_test.rb +0 -59
  67. data/test/resque_failure_redis_test.rb +0 -19
  68. data/test/resque_test.rb +0 -278
  69. data/test/test_helper.rb +0 -178
  70. data/test/worker_test.rb +0 -657
@@ -0,0 +1,24 @@
1
+ <table id="failed">
2
+ <tbody>
3
+ <tr class="total">
4
+ <td class='queue'>Total Failed</td>
5
+ <td class='center'><%= Resque::Failure.count %></td>
6
+ </tr>
7
+
8
+ <% Resque::Failure.queues.sort.each do |queue| %>
9
+ <tr>
10
+ <th><b class="queue-tag"><a href="<%= u "/failed/#{queue}" %>"><%= queue %></a></b></th>
11
+ <th style="width:75px;" class="center"><%= Resque::Failure.count(queue) %></th>
12
+ </tr>
13
+
14
+ <% failed_class_counts(queue).sort_by { |name,_| name }.each do |k, v| %>
15
+ <tr id="<%= k %>">
16
+ <td>
17
+ <a href="<%= u "/failed/#{queue}?class=#{k}" %>"><span class="failed failed_class"><%= k %></span></a>
18
+ </td>
19
+ <td style="text-align: center;" class="failed<%= (v.to_i > 1000) ? '_many' : '' %>"><%= v %></td>
20
+ </tr>
21
+ <% end %>
22
+ <% end %>
23
+ </tbody>
24
+ </table>
@@ -0,0 +1,8 @@
1
+ <% if job['class'] == 'ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper' %>
2
+ <code><%= job['args'].first['job_class'] %></code>
3
+ <small>
4
+ <a href="http://edgeguides.rubyonrails.org/active_job_basics.html" rel="noopener noreferrer" target="_blank">(via ActiveJob)</a>
5
+ </small>
6
+ <% else %>
7
+ <code><%= job['class'] %></code>
8
+ <% end %>
@@ -1,8 +1,6 @@
1
1
  <% if key = params[:key] %>
2
2
 
3
- <p class='sub'>
4
- Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <b><%=size = redis_get_size(key) %></b>
5
- </p>
3
+ <p class='sub'><%= page_entries_info start = params[:start].to_i, start + 20, size = redis_get_size(key) %></p>
6
4
 
7
5
  <h1>Key "<%= key %>" is a <%= resque.redis.type key %></h1>
8
6
  <table>
@@ -15,5 +13,5 @@
15
13
  <% end %>
16
14
  </table>
17
15
 
18
- <%= partial :next_more, :start => start, :size => size %>
16
+ <%= partial :next_more, :start => start, :size => size, :per_page => 20 %>
19
17
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <% if key = params[:key] %>
2
- <h1>Key "<%= key %>" is a <%= resque.redis.type key %></h1>
2
+ <h1>Key "<%= escape_html(key) %>" is a <%= resque.redis.type key %></h1>
3
3
  <h2>size: <%= redis_get_size(key) %></h2>
4
4
  <table>
5
5
  <tr>
@@ -2,12 +2,13 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
- <title>Resque.</title>
5
+ <title>Resque</title>
6
6
  <link href="<%=u 'reset.css' %>" media="screen" rel="stylesheet" type="text/css">
7
7
  <link href="<%=u 'style.css' %>" media="screen" rel="stylesheet" type="text/css">
8
- <script src="<%=u 'jquery-1.3.2.min.js' %>" type="text/javascript"></script>
8
+ <script src="<%=u 'jquery-3.6.0.min.js' %>" type="text/javascript"></script>
9
9
  <script src="<%=u 'jquery.relatize_date.js' %>" type="text/javascript"></script>
10
10
  <script src="<%=u 'ranger.js' %>" type="text/javascript"></script>
11
+ <script src="<%=u 'main.js' %>" type="text/javascript"></script>
11
12
  </head>
12
13
  <body>
13
14
  <div class="header">
@@ -23,7 +24,7 @@
23
24
  <% end %>
24
25
  </div>
25
26
 
26
- <% if @subtabs %>
27
+ <% if defined?(@subtabs) && @subtabs %>
27
28
  <ul class='subnav'>
28
29
  <% for subtab in @subtabs %>
29
30
  <li <%= class_if_current "#{current_section}/#{subtab}" %>><a href="<%= current_section %>/<%= subtab %>"><span><%= subtab %></span></a></li>
@@ -36,9 +37,9 @@
36
37
  </div>
37
38
 
38
39
  <div id="footer">
39
- <p>Powered by <a href="http://github.com/defunkt/resque">Resque</a> v<%=Resque::Version%></p>
40
- <p>Connected to Redis namespace <%= Resque.redis.namespace %> on <%=Resque.redis_id%></p>
40
+ <p>Powered by <a href="http://github.com/resque/resque">Resque</a> v<%=Resque::VERSION%></p>
41
+ <p>Connected to Redis namespace <%= Resque.redis.namespace %> on <%= h Resque.redis_id %></p>
41
42
  </div>
42
43
 
43
44
  </body>
44
- </html>
45
+ </html>
@@ -1,10 +1,22 @@
1
- <%if start - 20 >= 0 || start + 20 <= size%>
2
- <p class='pagination'>
3
- <% if start - 20 >= 0 %>
4
- <a href="<%= current_page %>?start=<%= start - 20 %>" class='less'>&laquo; less</a>
5
- <% end %>
6
- <% if start + 20 <= size %>
7
- <a href="<%= current_page %>?start=<%= start + 20 %>" class='more'>more &raquo;</a>
8
- <% end %>
9
- </p>
10
- <%end%>
1
+ <% # per_page was added in 1.23.1; gems which add to resque-server don't pass that variable along so it would crash %>
2
+ <% # without a default value %>
3
+ <% per_page ||= 20 %>
4
+ <%if start - per_page >= 0 || start + per_page <= size%>
5
+ <div class='pagination'>
6
+ <% if start - per_page >= 0 %>
7
+ <a href="<%= current_page %>?start=<%= start - per_page %>" class='less'>&laquo; Previous</a>
8
+ <% end %>
9
+
10
+ <% (size / per_page.to_f).ceil.times do |page_num| %>
11
+ <% if start == page_num * per_page %>
12
+ <span><%= page_num + 1 %></span>
13
+ <% else %>
14
+ <a href="<%= current_page %>?start=<%= page_num * per_page %>"> <%= page_num + 1 %></a>
15
+ <% end %>
16
+ <% end %>
17
+
18
+ <% if start + per_page < size %>
19
+ <a href="<%= current_page %>?start=<%= start + per_page %>" class='more'>Next &raquo;</a>
20
+ <% end %>
21
+ </div>
22
+ <%end%>
@@ -0,0 +1,2 @@
1
+ <%= partial :job_class, :job => job['payload'] %>
2
+ <small><a class="queue time" href="<%=u "/working/#{worker}" %>"><%= job['run_at'] %></a></small>
@@ -1,20 +1,20 @@
1
1
  <% @subtabs = resque.queues unless partial? || params[:id].nil? %>
2
2
 
3
- <% if queue = params[:id] %>
3
+ <% if current_queue = params[:id] %>
4
4
 
5
- <h1>Pending jobs on <span class='hl'><%= queue %></span></h1>
6
- <form method="POST" action="<%=u "/queues/#{queue}/remove" %>" class='remove-queue'>
7
- <input type='submit' name='' value='Remove Queue' onclick='return confirm("Are you absolutely sure? This cannot be undone.");' />
5
+ <h1>Pending jobs on <span class='hl'><%= h escape_html(current_queue) %></span></h1>
6
+ <form method="POST" action="<%=u "/queues/#{escape_html(current_queue)}/remove" %>" class='remove-queue'>
7
+ <input type='submit' name='' value='Remove Queue' class="confirmSubmission" />
8
8
  </form>
9
- <p class='sub'>Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <b><%=size = resque.size(queue)%></b> jobs</p>
9
+ <p class='sub'><%= page_entries_info start = params[:start].to_i, start + 19, size = resque.size(current_queue), 'job' %></p>
10
10
  <table class='jobs'>
11
11
  <tr>
12
12
  <th>Class</th>
13
13
  <th>Args</th>
14
14
  </tr>
15
- <% for job in (jobs = resque.peek(queue, start, 20)) %>
15
+ <% for job in (jobs = resque.peek(current_queue, start, 20)) %>
16
16
  <tr>
17
- <td class='class'><%= job['class'] %></td>
17
+ <td class='class'><%= partial :job_class, :job => job %></td>
18
18
  <td class='args'><%=h job['args'].inspect %></td>
19
19
  </tr>
20
20
  <% end %>
@@ -24,7 +24,7 @@
24
24
  </tr>
25
25
  <% end %>
26
26
  </table>
27
- <%= partial :next_more, :start => start, :size => size %>
27
+ <%= partial :next_more, :start => start, :size => size, :per_page => 20 %>
28
28
  <% else %>
29
29
 
30
30
  <h1 class='wi'>Queues</h1>
@@ -34,16 +34,25 @@
34
34
  <th>Name</th>
35
35
  <th>Jobs</th>
36
36
  </tr>
37
- <% for queue in resque.queues.sort_by { |q| q.to_s } %>
37
+ <% resque.queues.sort_by { |q| q.to_s }.each do |queue| %>
38
38
  <tr>
39
39
  <td class='queue'><a class="queue" href="<%= u "queues/#{queue}" %>"><%= queue %></a></td>
40
40
  <td class='size'><%= resque.size queue %></td>
41
41
  </tr>
42
42
  <% end %>
43
- <tr class="<%= Resque::Failure.count.zero? ? "failed" : "failure" %>">
44
- <td class='queue failed'><a class="queue" href="<%= u :failed %>">failed</a></td>
45
- <td class='size'><%= Resque::Failure.count %></td>
46
- </tr>
43
+ <% if failed_multiple_queues? %>
44
+ <% Resque::Failure.queues.sort_by { |q| q.to_s }.each_with_index do |queue, i| %>
45
+ <tr class="<%= Resque::Failure.count(queue).zero? ? "failed" : "failure" %><%= " first_failure" if i.zero? %>">
46
+ <td class='queue failed'><a class="queue" href="<%= u "failed/#{queue}" %>"><%= queue %></a></td>
47
+ <td class='size'><%= Resque::Failure.count(queue) %></td>
48
+ </tr>
49
+ <% end %>
50
+ <% else %>
51
+ <tr class="<%= Resque::Failure.count.zero? ? "failed" : "failure" %>">
52
+ <td class='queue failed'><a class="queue" href="<%= u :failed %>">failed</a></td>
53
+ <td class='size'><%= Resque::Failure.count %></td>
54
+ </tr>
55
+ <% end %>
47
56
  </table>
48
57
 
49
58
  <% end %>
@@ -6,7 +6,7 @@
6
6
 
7
7
  <% elsif params[:id] == "resque" %>
8
8
 
9
- <h1><%= resque %></h1>
9
+ <h1><%= h resque %></h1>
10
10
  <table class='stats'>
11
11
  <% for key, value in resque.info.to_a.sort_by { |i| i[0].to_s } %>
12
12
  <tr>
@@ -14,7 +14,7 @@
14
14
  <%= key %>
15
15
  </th>
16
16
  <td>
17
- <%= value %>
17
+ <%= h value %>
18
18
  </td>
19
19
  </tr>
20
20
  <% end %>
@@ -22,9 +22,9 @@
22
22
 
23
23
  <% elsif params[:id] == 'redis' %>
24
24
 
25
- <h1><%= resque.redis_id %></h1>
25
+ <h1><%= h resque.redis_id %></h1>
26
26
  <table class='stats'>
27
- <% for key, value in resque.redis.info.to_a.sort_by { |i| i[0].to_s } %>
27
+ <% for key, value in resque.redis.redis.info.to_a.sort_by { |i| i[0].to_s } %>
28
28
  <tr>
29
29
  <th>
30
30
  <%= key %>
@@ -38,7 +38,7 @@
38
38
 
39
39
  <% elsif params[:id] == 'keys' %>
40
40
 
41
- <h1>Keys owned by <%= resque %></h1>
41
+ <h1>Keys owned by <%= h resque.redis_id %></h1>
42
42
  <p class='sub'>(All keys are actually prefixed with "<%= Resque.redis.namespace %>:")</p>
43
43
  <table class='stats'>
44
44
  <tr>
@@ -9,6 +9,7 @@
9
9
  <th>Host</th>
10
10
  <th>Pid</th>
11
11
  <th>Started</th>
12
+ <th>Heartbeat</th>
12
13
  <th>Queues</th>
13
14
  <th>Processed</th>
14
15
  <th>Failed</th>
@@ -21,14 +22,14 @@
21
22
  <td><%= host %></td>
22
23
  <td><%= pid %></td>
23
24
  <td><span class="time"><%= worker.started %></span></td>
25
+ <td><span class="time"><%= worker.heartbeat %></span></td>
24
26
  <td class='queues'><%= queues.split(',').map { |q| '<a class="queue-tag" href="' + u("/queues/#{q}") + '">' + q + '</a>'}.join('') %></td>
25
27
  <td><%= worker.processed %></td>
26
28
  <td><%= worker.failed %></td>
27
29
  <td class='process'>
28
30
  <% data = worker.processing || {} %>
29
31
  <% if data['queue'] %>
30
- <code><%= data['payload']['class'] %></code>
31
- <small><a class="queue time" href="<%=u "/working/#{worker}" %>"><%= data['run_at'] %></a></small>
32
+ <%= partial :processing, :worker => worker, :job => data %>
32
33
  <% else %>
33
34
  <span class='waiting'>Waiting for a job...</span>
34
35
  <% end %>
@@ -68,8 +69,7 @@
68
69
  <td class='process'>
69
70
  <% data = worker.processing || {} %>
70
71
  <% if data['queue'] %>
71
- <code><%= data['payload']['class'] %></code>
72
- <small><a class="queue time" href="<%=u "/working/#{worker}" %>"><%= data['run_at'] %></a></small>
72
+ <%= partial :processing, :worker => worker, :job => data %>
73
73
  <% else %>
74
74
  <span class='waiting'>Waiting for a job...</span>
75
75
  <% end %>
@@ -1,5 +1,5 @@
1
- <% if params[:id] && (worker = Resque::Worker.find(params[:id])) && worker.job %>
2
- <h1><%= worker %>'s job</h1>
1
+ <% if params[:id] && (current_worker = Resque::Worker.find(params[:id])) && (data = current_worker.job) %>
2
+ <h1><%= current_worker %>'s job</h1>
3
3
 
4
4
  <table>
5
5
  <tr>
@@ -12,16 +12,16 @@
12
12
  </tr>
13
13
  <tr>
14
14
  <td><img src="<%=u 'working.png' %>" alt="working" title="working"></td>
15
- <% host, pid, _ = worker.to_s.split(':') %>
16
- <td><a href="<%=u "/workers/#{worker}" %>"><%= host %>:<%= pid %></a></td>
17
- <% data = worker.job %>
15
+ <% host, pid, _ = current_worker.to_s.split(':') %>
16
+ <td><a href="<%=u "/workers/#{current_worker}" %>"><%= host %>:<%= pid %></a></td>
18
17
  <% queue = data['queue'] %>
19
18
  <td><a class="queue" href="<%=u "/queues/#{queue}" %>"><%= queue %></a></td>
20
19
  <td><span class="time"><%= data['run_at'] %></span></td>
20
+ <% payload = data.key?('payload') ? data['payload'] : {} %>
21
21
  <td>
22
- <code><%= data['payload']['class'] %></code>
22
+ <code><%= payload.key?('class') ? payload['class'] : "—" %></code>
23
23
  </td>
24
- <td><%=h data['payload']['args'].inspect %></td>
24
+ <td><pre><%=h payload.key?('args') ? show_args(payload['args']) : "—" %></pre></td>
25
25
  </tr>
26
26
  </table>
27
27
 
@@ -49,18 +49,17 @@
49
49
  </tr>
50
50
  <% end %>
51
51
 
52
- <% worker_jobs.sort_by {|w, j| j['run_at'] ? j['run_at'] : '' }.each do |worker, job| %>
52
+ <% worker_jobs.sort_by { |_w, j| j['run_at'] ? j['run_at'].to_s() : '' }.each do |worker, job| %>
53
53
  <tr>
54
54
  <td class='icon'><img src="<%=u state = worker.state %>.png" alt="<%= state %>" title="<%= state %>"></td>
55
- <% host, pid, queues = worker.to_s.split(':') %>
55
+ <% host, pid, _queues = worker.to_s.split(':') %>
56
56
  <td class='where'><a href="<%=u "/workers/#{worker}" %>"><%= host %>:<%= pid %></a></td>
57
57
  <td class='queues queue'>
58
58
  <a class="queue-tag" href="<%=u "/queues/#{job['queue']}" %>"><%= job['queue'] %></a>
59
59
  </td>
60
60
  <td class='process'>
61
61
  <% if job['queue'] %>
62
- <code><%= job['payload']['class'] %></code>
63
- <small><a class="queue time" href="<%=u "/working/#{worker}" %>"><%= job['run_at'] %></a></small>
62
+ <%= partial :processing, :worker => worker, :job => job %>
64
63
  <% else %>
65
64
  <span class='waiting'>Waiting for a job...</span>
66
65
  <% end %>
data/lib/resque/server.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require 'sinatra/base'
2
- require 'erb'
2
+ require 'tilt/erb'
3
3
  require 'resque'
4
+ require 'resque/server_helper'
4
5
  require 'resque/version'
5
6
  require 'time'
7
+ require 'yaml'
6
8
 
7
- if defined? Encoding
9
+ if defined?(Encoding) && Encoding.default_external != Encoding::UTF_8
8
10
  Encoding.default_external = Encoding::UTF_8
9
11
  end
10
12
 
@@ -23,109 +25,7 @@ module Resque
23
25
  set :static, true
24
26
 
25
27
  helpers do
26
- include Rack::Utils
27
- alias_method :h, :escape_html
28
-
29
- def current_section
30
- url_path request.path_info.sub('/','').split('/')[0].downcase
31
- end
32
-
33
- def current_page
34
- url_path request.path_info.sub('/','')
35
- end
36
-
37
- def url_path(*path_parts)
38
- [ path_prefix, path_parts ].join("/").squeeze('/')
39
- end
40
- alias_method :u, :url_path
41
-
42
- def path_prefix
43
- request.env['SCRIPT_NAME']
44
- end
45
-
46
- def class_if_current(path = '')
47
- 'class="current"' if current_page[0, path.size] == path
48
- end
49
-
50
- def tab(name)
51
- dname = name.to_s.downcase
52
- path = url_path(dname)
53
- "<li #{class_if_current(path)}><a href='#{path}'>#{name}</a></li>"
54
- end
55
-
56
- def tabs
57
- Resque::Server.tabs
58
- end
59
-
60
- def redis_get_size(key)
61
- case Resque.redis.type(key)
62
- when 'none'
63
- []
64
- when 'list'
65
- Resque.redis.llen(key)
66
- when 'set'
67
- Resque.redis.scard(key)
68
- when 'string'
69
- Resque.redis.get(key).length
70
- when 'zset'
71
- Resque.redis.zcard(key)
72
- end
73
- end
74
-
75
- def redis_get_value_as_array(key, start=0)
76
- case Resque.redis.type(key)
77
- when 'none'
78
- []
79
- when 'list'
80
- Resque.redis.lrange(key, start, start + 20)
81
- when 'set'
82
- Resque.redis.smembers(key)[start..(start + 20)]
83
- when 'string'
84
- [Resque.redis.get(key)]
85
- when 'zset'
86
- Resque.redis.zrange(key, start, start + 20)
87
- end
88
- end
89
-
90
- def show_args(args)
91
- Array(args).map { |a| a.inspect }.join("\n")
92
- end
93
-
94
- def worker_hosts
95
- @worker_hosts ||= worker_hosts!
96
- end
97
-
98
- def worker_hosts!
99
- hosts = Hash.new { [] }
100
-
101
- Resque.workers.each do |worker|
102
- host, _ = worker.to_s.split(':')
103
- hosts[host] += [worker.to_s]
104
- end
105
-
106
- hosts
107
- end
108
-
109
- def partial?
110
- @partial
111
- end
112
-
113
- def partial(template, local_vars = {})
114
- @partial = true
115
- erb(template.to_sym, {:layout => false}, local_vars)
116
- ensure
117
- @partial = false
118
- end
119
-
120
- def poll
121
- if @polling
122
- text = "Last Updated: #{Time.now.strftime("%H:%M:%S")}"
123
- else
124
- text = "<a href='#{u(request.path_info)}.poll' rel='poll'>Live Poll</a>"
125
- end
126
- "<p class='poll'>#{text}</p>"
127
- end
128
-
28
+ include Resque::ServerHelper
129
29
  end
130
30
 
131
31
  def show(page, layout = true)
@@ -181,18 +81,39 @@ module Resque
181
81
  end
182
82
  end
183
83
 
84
+ get "/failed/:queue" do
85
+ if Resque::Failure.url
86
+ redirect Resque::Failure.url
87
+ else
88
+ show :failed
89
+ end
90
+ end
91
+
184
92
  post "/failed/clear" do
185
93
  Resque::Failure.clear
186
94
  redirect u('failed')
187
95
  end
188
96
 
97
+ post "/failed/clear_retried" do
98
+ Resque::Failure.clear_retried
99
+ redirect u('failed')
100
+ end
101
+
102
+ post "/failed/:queue/clear" do
103
+ Resque::Failure.clear params[:queue]
104
+ redirect u('failed')
105
+ end
106
+
189
107
  post "/failed/requeue/all" do
190
- Resque::Failure.count.times do |num|
191
- Resque::Failure.requeue(num)
192
- end
108
+ Resque::Failure.requeue_all
193
109
  redirect u('failed')
194
110
  end
195
111
 
112
+ post "/failed/:queue/requeue/all" do
113
+ Resque::Failure.requeue_queue Resque::Failure.job_queue_name(params[:queue])
114
+ redirect url_path("/failed/#{params[:queue]}")
115
+ end
116
+
196
117
  get "/failed/requeue/:index/?" do
197
118
  Resque::Failure.requeue(params[:index])
198
119
  if request.xhr?
@@ -202,11 +123,25 @@ module Resque
202
123
  end
203
124
  end
204
125
 
126
+ get "/failed/:queue/requeue/:index/?" do
127
+ Resque::Failure.requeue(params[:index], params[:queue])
128
+ if request.xhr?
129
+ return Resque::Failure.all(params[:index],1,params[:queue])['retried_at']
130
+ else
131
+ redirect url_path("/failed/#{params[:queue]}")
132
+ end
133
+ end
134
+
205
135
  get "/failed/remove/:index/?" do
206
136
  Resque::Failure.remove(params[:index])
207
137
  redirect u('failed')
208
138
  end
209
139
 
140
+ get "/failed/:queue/remove/:index/?" do
141
+ Resque::Failure.remove(params[:index], params[:queue])
142
+ redirect url_path("/failed/#{params[:queue]}")
143
+ end
144
+
210
145
  get "/stats/?" do
211
146
  redirect url_path("/stats/resque")
212
147
  end
@@ -244,5 +179,13 @@ module Resque
244
179
  def self.tabs
245
180
  @tabs ||= ["Overview", "Working", "Failed", "Queues", "Workers", "Stats"]
246
181
  end
182
+
183
+ def self.url_prefix=(url_prefix)
184
+ @url_prefix = url_prefix
185
+ end
186
+
187
+ def self.url_prefix
188
+ (@url_prefix.nil? || @url_prefix.empty?) ? '' : @url_prefix + '/'
189
+ end
247
190
  end
248
191
  end