sidekiq-job_monitor 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3c554ad234720879c74de12d2cf115cb1708012
4
- data.tar.gz: cc071f88a7897b1b81e0bd4969b0100b3e046544
3
+ metadata.gz: 3b1d3e4b21e888c43304c1353a7cd44d9bd9fb7f
4
+ data.tar.gz: a4b8740f91c16aeb23fccf94f0c47c980857bb28
5
5
  SHA512:
6
- metadata.gz: f2a7a616be721bb98f986d7e730a8417fc4aa4a92807dd2b9dcf4825299f18b68f47d822d55cd76aed0604821e8e8db9861e80a4e0fb5f5bd92aaf3a3e5b6d24
7
- data.tar.gz: f20aed8dca5422ad05d0b541ba158b214b4c55e9dc9b0333cfc67cad8fddbf86ddd2186e4a391b458167a1f4fa9337a8cee9a75fdf5917176a54335999e9d5e0
6
+ metadata.gz: 3549b4f766d1742c3222f316797c5ba60ac519579beb2b21a05ab752114fce74450ebca64284feeacd5c6d87666fc7415eb9992a016fb88a7a858592f5e22deb
7
+ data.tar.gz: b7810de4b7c3030f9feff07e38c28bc6ba68daddb2d3d993c819737ee8d3423ac781cc097c1a47fc5ca3f218f93c69a13dd0cd257ea936f0d1b6335c20e98120
data/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # Sidekiq Job Monitor
2
+
3
+ This gem allows you to easily monitor your jobs progression from your client.
4
+
5
+ This is often useful when the user has to wait for a specific job to complete
6
+ to access some produced data.
7
+
8
+ The original use case was to allow users to see a "work in progress" modal
9
+ while a big document was being generated, and then redirect them to download
10
+ it when the job has completed.
11
+
12
+ The gem plugs into Sidekiq's job processor as a middleware to track the
13
+ job progress and make it available through an JSON endpoint.
14
+
15
+ There's also a simple javascript client that allows you to hook into the
16
+ complete and failed events.
17
+
18
+ ## Installation
19
+
20
+ Add to your Gemfile and `bundle install`:
21
+
22
+ ```ruby
23
+ gem 'sidekiq-job_monitor'
24
+ ```
25
+
26
+ Mount the engine in your routes.rb :
27
+
28
+ ```ruby
29
+ mount Sidekiq::JobMonitor::Engine => '/job-monitor', as: :job_monitor
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ The supported workflow for the gem is the following :
35
+
36
+ 1. The user requests a document that need time to be processed
37
+ 2. The server enqueues a sidekiq job in high priority queue and returns a waiting message in the form of a modal (for instance)
38
+ 3. The client polls the server to know when the job is done
39
+ 4. When the job is done, the server returns data to the client so that it can take some action to deliver the document
40
+
41
+ ### 1. Requesting the document
42
+
43
+ Add a link to the job starting endpoint as a remote link :
44
+
45
+ ```erb
46
+ <%= link_to 'Download report', build_report_path(@report), remote: true, data: { :'job-monitor-link' => true }
47
+ ```
48
+
49
+ Initialize the javascript client and make it handle the main events :
50
+
51
+ ```javascript
52
+ $(function() {
53
+ $('[data-job-monitor-link]').each(function(i, el) {
54
+ $(el).sidekiqJobMonitor({
55
+ onStart: function($el) {
56
+ // If you return a modal box from the server, initialize it
57
+ $el.appendTo('body').modal();
58
+ // Handle the "complete" event and redirect the user to a target
59
+ // URL where it will be able to download the document
60
+ $el.on('complete', function(e, monitor, data) {
61
+ window.location.href = data.url;
62
+ });
63
+ // You can also stop monitoring the progress, for instance when the
64
+ // modal is closed :
65
+ $el.on('hide', function() {
66
+ $el.trigger('stop');
67
+ });
68
+ }
69
+ });
70
+ });
71
+ });
72
+ ```
73
+
74
+ ### 2. The server enqueues a sidekiq job in high priority queue and returns a waiting message
75
+
76
+ Enqueue a job with a worker as usual, and store the Job ID in the controller
77
+
78
+ ```ruby
79
+ class ReportsController
80
+ def build
81
+ @job_id = MyReportWorker.perform_async(params[:id])
82
+ render layout: false
83
+ end
84
+ end
85
+ ```
86
+
87
+ Render a modal and return the monitoring URL as the main returned node's
88
+ `[data-monitor-url]` attribute, with the URL returned by `job_monitor.job_progress_path(job_id)` :
89
+
90
+ ```erb
91
+ <div class="modal" data-monitor-url="<%= job_monitor.job_progress_path(@job_id) %>">
92
+ <!-- Snip -->
93
+ Please wait ...
94
+ <!-- Snip -->
95
+ </div>
96
+ ```
97
+
98
+ ### 3. The client polls the server to know when the job is done
99
+
100
+ This part is already covered by the javascript code we wrote in step 1.
101
+
102
+ All you need is the correct plugin initialization and returning the
103
+ `data-monitor-url` attribute on the main returned node.
104
+
105
+ ### 4. The client polls the server to know when the job is done
106
+
107
+ When the job is done, a javascript `complete` event is triggered on the modal.
108
+ We already handled that in step 1.
109
+
110
+ All we need now is to provide the `url` field in the data object returned by
111
+ the server upon job completion.
112
+
113
+ To do so, we add the `#monitoring_data` method to our worker class.
114
+ This method takes the exact same arguments as the `#perform` method, plus
115
+ the current job state (pending, processing, complete or failed) as the last
116
+ argument.
117
+
118
+ ```ruby
119
+ class MyReportWorker
120
+ include Sidekiq::Worker
121
+
122
+ def perform(report_id)
123
+ # Your worker logic here as usual ...
124
+ end
125
+
126
+ def monitoring_data(report_id, state)
127
+ # Pseudo logic to get the desired URL
128
+ { url: Report.find(report_id).document_url } if state == 'complete'
129
+ end
130
+ end
131
+ ```
132
+
133
+ Those fields will be added to the data hash returned by the server as JSON
134
+ and passed to the `complete` event callback as the last argument.
135
+
136
+ ## Licence
137
+
138
+ This project rocks and uses MIT-LICENSE.
@@ -4,9 +4,10 @@ class Sidekiq.JobMonitor
4
4
  constructor: (markup, options = {}) ->
5
5
  @$el = $(markup)
6
6
  @monitorURL = @$el.data('monitor-url')
7
- setTimeout(@monitorProgress, 1000)
8
- $('body').trigger('start', [this])
7
+ @monitor()
9
8
  options.onStart?(@$el)
9
+ @$el.on('stop', @stopMonitoring)
10
+ $('body').trigger('start', [this])
10
11
 
11
12
  monitorProgress: =>
12
13
  $.getJSON(@monitorURL)
@@ -17,7 +18,10 @@ class Sidekiq.JobMonitor
17
18
  if data.state is 'complete'
18
19
  @jobComplete(data)
19
20
  else
20
- setTimeout(@monitorProgress, 1000)
21
+ @monitor()
22
+
23
+ monitor: ->
24
+ @monitorTimer = setTimeout(@monitorProgress, 1000)
21
25
 
22
26
  jobComplete: (data) ->
23
27
  console.log "trigger completion : ", this, data
@@ -26,9 +30,8 @@ class Sidekiq.JobMonitor
26
30
  jobFailed: =>
27
31
  @$el.trigger('failed', [this])
28
32
 
29
- trigger: (eventName, args...) ->
30
- args = [this].concat(args)
31
- @$el.trigger(eventName, args)
33
+ stopMonitoring: =>
34
+ clearTimeout(@monitorTimer) if @monitorTimer
32
35
 
33
36
  $.fn.sidekiqJobMonitor = (options = {}) ->
34
37
  @each (i, el) ->
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module JobMonitor
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-job_monitor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - vala
@@ -46,6 +46,7 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - MIT-LICENSE
49
+ - README.md
49
50
  - Rakefile
50
51
  - app/assets/javascripts/sidekiq-job_monitor.coffee
51
52
  - app/assets/javascripts/sidekiq_job_monitor/application.js