good_job 3.15.13 → 3.15.14
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 +4 -4
- data/CHANGELOG.md +24 -4
- data/README.md +7 -7
- data/app/models/good_job/base_execution.rb +1 -1
- data/app/models/good_job/process.rb +39 -17
- data/app/views/good_job/processes/index.html.erb +4 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fr.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/tr.yml +220 -0
- data/config/locales/ua.yml +1 -0
- data/lib/good_job/active_job_extensions/concurrency.rb +1 -1
- data/lib/good_job/capsule.rb +1 -1
- data/lib/good_job/notifier/{process_registration.rb → process_heartbeat.rb} +10 -1
- data/lib/good_job/notifier.rb +15 -13
- data/lib/good_job/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b2afabac45c47dd0326312ac0f111aaff7c977cc33baded1c2c0b97b824e1510
|
|
4
|
+
data.tar.gz: 5d36fd716c45bb4874c5431945b5423e0385d1e49bb32b98f36902679f62511b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4459b866f3d1f266b5e587e21f5fae9bb30a3deea54716f35658581adbacd09cefe470ef9f0d04f0b8cda53f330fb3ba20f69d706670353bd2615cb44ad6f38c
|
|
7
|
+
data.tar.gz: d37e446d66085c33665bc0e93b5caff2cd249baa0b3394b337e6023f1d9803faea4622a7ffac96d4817196a10ba0a762db57648846f88bc25d1455928fad8865
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [v3.15.14](https://github.com/bensheldon/good_job/tree/v3.15.14) (2023-07-03)
|
|
4
|
+
|
|
5
|
+
[Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.13...v3.15.14)
|
|
6
|
+
|
|
7
|
+
**Fixed bugs:**
|
|
8
|
+
|
|
9
|
+
- Dashboard error when trying to display 0 running/queued/retried jobs due to missing 'zero' translation [\#990](https://github.com/bensheldon/good_job/issues/990)
|
|
10
|
+
|
|
11
|
+
**Closed issues:**
|
|
12
|
+
|
|
13
|
+
- Persisting ActiveSupport::CurrentAttributes [\#981](https://github.com/bensheldon/good_job/issues/981)
|
|
14
|
+
- uninitialized constant DiscreteExecution [\#962](https://github.com/bensheldon/good_job/issues/962)
|
|
15
|
+
- Hard kill resilience with execution counts [\#922](https://github.com/bensheldon/good_job/issues/922)
|
|
16
|
+
|
|
17
|
+
**Merged pull requests:**
|
|
18
|
+
|
|
19
|
+
- Bump rubocop from 1.53.0 to 1.54.0 [\#994](https://github.com/bensheldon/good_job/pull/994) ([dependabot[bot]](https://github.com/apps/dependabot))
|
|
20
|
+
- Bump rails from 7.0.5 to 7.0.6 [\#993](https://github.com/bensheldon/good_job/pull/993) ([dependabot[bot]](https://github.com/apps/dependabot))
|
|
21
|
+
- Fix CI: Lock traces version for Ruby 2.6 compatible version [\#987](https://github.com/bensheldon/good_job/pull/987) ([bensheldon](https://github.com/bensheldon))
|
|
22
|
+
- Turkish Language support [\#986](https://github.com/bensheldon/good_job/pull/986) ([SemihCag](https://github.com/SemihCag))
|
|
23
|
+
- Add explicit namespace back to `GoodJob::DiscreteExecution` [\#983](https://github.com/bensheldon/good_job/pull/983) ([bensheldon](https://github.com/bensheldon))
|
|
24
|
+
- Add Process heartbeat that is updated inside of Notifier [\#977](https://github.com/bensheldon/good_job/pull/977) ([bensheldon](https://github.com/bensheldon))
|
|
25
|
+
- Use generic error reporter in Readme examples [\#964](https://github.com/bensheldon/good_job/pull/964) ([shouichi](https://github.com/shouichi))
|
|
26
|
+
|
|
3
27
|
## [v3.15.13](https://github.com/bensheldon/good_job/tree/v3.15.13) (2023-06-14)
|
|
4
28
|
|
|
5
29
|
[Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.12...v3.15.13)
|
|
@@ -43,10 +67,6 @@
|
|
|
43
67
|
|
|
44
68
|
- Ensure migration warning for `DiscreteExecution` constant is in explicit `GoodJob::` namespace [\#963](https://github.com/bensheldon/good_job/pull/963) ([bensheldon](https://github.com/bensheldon))
|
|
45
69
|
|
|
46
|
-
**Closed issues:**
|
|
47
|
-
|
|
48
|
-
- uninitialized constant DiscreteExecution [\#962](https://github.com/bensheldon/good_job/issues/962)
|
|
49
|
-
|
|
50
70
|
## [v3.15.9](https://github.com/bensheldon/good_job/tree/v3.15.9) (2023-05-21)
|
|
51
71
|
|
|
52
72
|
[Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.8...v3.15.9)
|
data/README.md
CHANGED
|
@@ -231,7 +231,7 @@ Rails.application.configure do
|
|
|
231
231
|
# Configure options individually...
|
|
232
232
|
config.good_job.preserve_job_records = true
|
|
233
233
|
config.good_job.retry_on_unhandled_error = false
|
|
234
|
-
config.good_job.on_thread_error = -> (exception) {
|
|
234
|
+
config.good_job.on_thread_error = -> (exception) { Rails.error.report(exception) }
|
|
235
235
|
config.good_job.execution_mode = :async
|
|
236
236
|
config.good_job.queues = '*'
|
|
237
237
|
config.good_job.max_threads = 5
|
|
@@ -244,7 +244,7 @@ Rails.application.configure do
|
|
|
244
244
|
config.good_job = {
|
|
245
245
|
preserve_job_records: true,
|
|
246
246
|
retry_on_unhandled_error: false,
|
|
247
|
-
on_thread_error: -> (exception) {
|
|
247
|
+
on_thread_error: -> (exception) { Rails.error.report(exception) },
|
|
248
248
|
execution_mode: :async,
|
|
249
249
|
queues: '*',
|
|
250
250
|
max_threads: 5,
|
|
@@ -287,7 +287,7 @@ Available configuration options are:
|
|
|
287
287
|
- `on_thread_error` (proc, lambda, or callable) will be called when there is an Exception. It can be useful for logging errors to bug tracking services, like Sentry or Airbrake. Example:
|
|
288
288
|
|
|
289
289
|
```ruby
|
|
290
|
-
config.good_job.on_thread_error = -> (exception) {
|
|
290
|
+
config.good_job.on_thread_error = -> (exception) { Rails.error.report(exception) }
|
|
291
291
|
```
|
|
292
292
|
|
|
293
293
|
By default, GoodJob configures the following execution modes per environment:
|
|
@@ -760,7 +760,7 @@ If errors do reach GoodJob, you can assign a callable to `GoodJob.on_thread_erro
|
|
|
760
760
|
|
|
761
761
|
```ruby
|
|
762
762
|
# config/initializers/good_job.rb
|
|
763
|
-
GoodJob.on_thread_error = -> (exception) {
|
|
763
|
+
GoodJob.on_thread_error = -> (exception) { Rails.error.report(exception) }
|
|
764
764
|
```
|
|
765
765
|
|
|
766
766
|
#### Retries
|
|
@@ -794,13 +794,13 @@ class ApplicationJob < ActiveJob::Base
|
|
|
794
794
|
retry_on StandardError, wait: :exponentially_longer, attempts: Float::INFINITY
|
|
795
795
|
|
|
796
796
|
retry_on SpecialError, attempts: 5 do |_job, exception|
|
|
797
|
-
|
|
797
|
+
Rails.error.report(exception)
|
|
798
798
|
end
|
|
799
799
|
|
|
800
800
|
around_perform do |_job, block|
|
|
801
801
|
block.call
|
|
802
802
|
rescue StandardError => e
|
|
803
|
-
|
|
803
|
+
Rails.error.report(e)
|
|
804
804
|
raise
|
|
805
805
|
end
|
|
806
806
|
# ...
|
|
@@ -823,7 +823,7 @@ ActionMailer::MailDeliveryJob.retry_on StandardError, wait: :exponentially_longe
|
|
|
823
823
|
ActionMailer::MailDeliveryJob.around_perform do |_job, block|
|
|
824
824
|
block.call
|
|
825
825
|
rescue StandardError => e
|
|
826
|
-
|
|
826
|
+
Rails.error.report(e)
|
|
827
827
|
raise
|
|
828
828
|
end
|
|
829
829
|
```
|
|
@@ -7,7 +7,9 @@ module GoodJob # :nodoc:
|
|
|
7
7
|
include AssignableConnection
|
|
8
8
|
include Lockable
|
|
9
9
|
|
|
10
|
+
# Interval until the process record being updated
|
|
10
11
|
STALE_INTERVAL = 30.seconds
|
|
12
|
+
# Interval until the process record is treated as expired
|
|
11
13
|
EXPIRED_INTERVAL = 5.minutes
|
|
12
14
|
|
|
13
15
|
self.table_name = 'good_job_processes'
|
|
@@ -31,20 +33,26 @@ module GoodJob # :nodoc:
|
|
|
31
33
|
# UUID that is unique to the current process and changes when forked.
|
|
32
34
|
# @return [String]
|
|
33
35
|
def self.current_id
|
|
34
|
-
mutex.synchronize
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
_current_id
|
|
36
|
+
mutex.synchronize { ns_current_id }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.ns_current_id
|
|
40
|
+
if _current_id.nil? || _pid != ::Process.pid
|
|
41
|
+
self._current_id = SecureRandom.uuid
|
|
42
|
+
self._pid = ::Process.pid
|
|
40
43
|
end
|
|
44
|
+
_current_id
|
|
41
45
|
end
|
|
42
46
|
|
|
43
47
|
# Hash representing metadata about the current process.
|
|
44
48
|
# @return [Hash]
|
|
45
49
|
def self.current_state
|
|
50
|
+
mutex.synchronize { ns_current_state }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.ns_current_state
|
|
46
54
|
{
|
|
47
|
-
id:
|
|
55
|
+
id: ns_current_id,
|
|
48
56
|
hostname: Socket.gethostname,
|
|
49
57
|
pid: ::Process.pid,
|
|
50
58
|
proctitle: $PROGRAM_NAME,
|
|
@@ -63,29 +71,43 @@ module GoodJob # :nodoc:
|
|
|
63
71
|
# Registers the current process in the database
|
|
64
72
|
# @return [GoodJob::Process]
|
|
65
73
|
def self.register
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
mutex.synchronize do
|
|
75
|
+
process_state = ns_current_state
|
|
76
|
+
create(id: process_state[:id], state: process_state, create_with_advisory_lock: true)
|
|
77
|
+
rescue ActiveRecord::RecordNotUnique
|
|
78
|
+
find(ns_current_state[:id])
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def refresh
|
|
83
|
+
mutex.synchronize do
|
|
84
|
+
reload
|
|
85
|
+
update(state: self.class.ns_current_state, updated_at: Time.current)
|
|
86
|
+
rescue ActiveRecord::RecordNotFound
|
|
87
|
+
false
|
|
88
|
+
end
|
|
69
89
|
end
|
|
70
90
|
|
|
71
91
|
# Unregisters the instance.
|
|
72
92
|
def deregister
|
|
73
93
|
return unless owns_advisory_lock?
|
|
74
94
|
|
|
75
|
-
|
|
76
|
-
|
|
95
|
+
mutex.synchronize do
|
|
96
|
+
destroy!
|
|
97
|
+
advisory_unlock
|
|
98
|
+
end
|
|
77
99
|
end
|
|
78
100
|
|
|
79
101
|
def basename
|
|
80
102
|
File.basename(state["proctitle"])
|
|
81
103
|
end
|
|
82
104
|
|
|
83
|
-
def
|
|
84
|
-
|
|
85
|
-
end
|
|
105
|
+
def refresh_if_stale(cleanup: false)
|
|
106
|
+
return unless stale?
|
|
86
107
|
|
|
87
|
-
|
|
88
|
-
|
|
108
|
+
result = refresh
|
|
109
|
+
self.class.cleanup if cleanup
|
|
110
|
+
result
|
|
89
111
|
end
|
|
90
112
|
|
|
91
113
|
def stale?
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
<div class="col-2 d-flex gap-2">
|
|
12
12
|
<span><%= t ".started" %></span>
|
|
13
13
|
</div>
|
|
14
|
+
<div class="col-2 d-flex gap-2">
|
|
15
|
+
<span><%= t ".updated" %></span>
|
|
16
|
+
</div>
|
|
14
17
|
<div class="col-auto">
|
|
15
18
|
<%= tag.button type: "button", class: "btn btn-sm text-muted ms-auto", role: "button",
|
|
16
19
|
data: { bs_toggle: "collapse", bs_target: ".process-state" },
|
|
@@ -42,6 +45,7 @@
|
|
|
42
45
|
<% end %>
|
|
43
46
|
</div>
|
|
44
47
|
<div class="col-2 small"><%= relative_time(process.created_at) %></div>
|
|
48
|
+
<div class="col-2 small"><%= relative_time(process.updated_at) %></div>
|
|
45
49
|
<div class="col-auto">
|
|
46
50
|
<%= tag.button type: "button", class: "btn btn-sm text-muted ms-auto", role: "button",
|
|
47
51
|
title: t("good_job.actions.inspect"),
|
data/config/locales/de.yml
CHANGED
data/config/locales/en.yml
CHANGED
data/config/locales/es.yml
CHANGED
data/config/locales/fr.yml
CHANGED
data/config/locales/ja.yml
CHANGED
data/config/locales/nl.yml
CHANGED
data/config/locales/ru.yml
CHANGED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
tr:
|
|
3
|
+
good_job:
|
|
4
|
+
actions:
|
|
5
|
+
destroy: Sil
|
|
6
|
+
discard: İptal Et
|
|
7
|
+
inspect: İncele
|
|
8
|
+
reschedule: Yeniden planla
|
|
9
|
+
retry: Tekrar dene
|
|
10
|
+
batches:
|
|
11
|
+
index:
|
|
12
|
+
older_batches: Daha eski toplu işlemler
|
|
13
|
+
pending_migrations: GoodJob'ın bekleyen veritabanı güncellemeleri bulunuyor.
|
|
14
|
+
title: Toplu İşlemler
|
|
15
|
+
jobs:
|
|
16
|
+
actions:
|
|
17
|
+
confirm_destroy: Bu işi silmek istediğinizden emin misiniz?
|
|
18
|
+
confirm_discard: Bu işi iptal etmek istediğinizden emin misiniz?
|
|
19
|
+
confirm_reschedule: Bu işi yeniden planlamak istediğinizden emin misiniz?
|
|
20
|
+
confirm_retry: Bu işi tekrar denemek istediğinizden emin misiniz?
|
|
21
|
+
destroy: İşi Sil
|
|
22
|
+
discard: İşi İptal Et
|
|
23
|
+
reschedule: İşi Yeniden Planla
|
|
24
|
+
retry: İşi Tekrar Dene
|
|
25
|
+
title: İşlemler
|
|
26
|
+
no_jobs_found: İş bulunamadı.
|
|
27
|
+
show:
|
|
28
|
+
attributes: Özellikler
|
|
29
|
+
batched_jobs: Toplu İşlenmiş İşler
|
|
30
|
+
callback_jobs: Geri Çağırma İşleri
|
|
31
|
+
table:
|
|
32
|
+
no_batches_found: Toplu İşlem bulunamadı.
|
|
33
|
+
cron_entries:
|
|
34
|
+
actions:
|
|
35
|
+
confirm_disable: Bu cron girişini devre dışı bırakmak istediğinizden emin misiniz?
|
|
36
|
+
confirm_enable: Bu cron girişini etkinleştirmek istediğinizden emin misiniz?
|
|
37
|
+
confirm_enqueue: Bu cron girişini hemen kuyruğa eklemek istediğinizden emin misiniz?
|
|
38
|
+
disable: Cron girişini devre dışı bırak
|
|
39
|
+
enable: Cron girişini etkinleştir
|
|
40
|
+
enqueue: Cron girişini hemen kuyruğa ekle
|
|
41
|
+
disable:
|
|
42
|
+
notice: Cron girişi devre dışı bırakıldı.
|
|
43
|
+
enable:
|
|
44
|
+
notice: Cron girişi etkinleştirildi.
|
|
45
|
+
enqueue:
|
|
46
|
+
notice: Cron girişi kuyruğa eklendi.
|
|
47
|
+
index:
|
|
48
|
+
no_cron_schedules_found: Planlanmış Cron bulunamadı.
|
|
49
|
+
title: Cron Planları
|
|
50
|
+
pending_migrations: Bekleyen GoodJob veritabanı güncellemesi var.
|
|
51
|
+
show:
|
|
52
|
+
cron_entry_key: Cron Giriş Anahtarı
|
|
53
|
+
datetime:
|
|
54
|
+
distance_in_words:
|
|
55
|
+
about_x_hours:
|
|
56
|
+
one: yaklaşık 1 saat
|
|
57
|
+
other: yaklaşık %{count} saat
|
|
58
|
+
about_x_months:
|
|
59
|
+
one: yaklaşık 1 ay
|
|
60
|
+
other: yaklaşık %{count} ay
|
|
61
|
+
about_x_years:
|
|
62
|
+
one: yaklaşık 1 yıl
|
|
63
|
+
other: yaklaşık %{count} yıl
|
|
64
|
+
almost_x_years:
|
|
65
|
+
one: neredeyse 1 yıl
|
|
66
|
+
other: neredeyse %{count} yıl
|
|
67
|
+
half_a_minute: yarım dakika
|
|
68
|
+
less_than_x_minutes:
|
|
69
|
+
one: 1 dakikadan az
|
|
70
|
+
other: "%{count} dakikadan az"
|
|
71
|
+
less_than_x_seconds:
|
|
72
|
+
one: 1 saniyeden az
|
|
73
|
+
other: "%{count} saniyeden az"
|
|
74
|
+
over_x_years:
|
|
75
|
+
one: 1 yıldan fazla
|
|
76
|
+
other: "%{count} yıldan fazla"
|
|
77
|
+
x_days:
|
|
78
|
+
one: 1 gün
|
|
79
|
+
other: "%{count} gün"
|
|
80
|
+
x_minutes:
|
|
81
|
+
one: 1 dakika
|
|
82
|
+
other: "%{count} dakika"
|
|
83
|
+
x_months:
|
|
84
|
+
one: 1 ay
|
|
85
|
+
other: "%{count} ay"
|
|
86
|
+
x_seconds:
|
|
87
|
+
one: 1 saniye
|
|
88
|
+
other: "%{count} saniye"
|
|
89
|
+
x_years:
|
|
90
|
+
one: 1 yıl
|
|
91
|
+
other: "%{count} yıl"
|
|
92
|
+
duration:
|
|
93
|
+
hours: "%{hour}sa %{min}d"
|
|
94
|
+
less_than_10_seconds: "%{sec} s"
|
|
95
|
+
milliseconds: "%{ms} ms"
|
|
96
|
+
minutes: "%{min}d %{sec}s"
|
|
97
|
+
seconds: "%{sec}s"
|
|
98
|
+
helpers:
|
|
99
|
+
relative_time:
|
|
100
|
+
future: "%{time} içinde"
|
|
101
|
+
past: "%{time} önce"
|
|
102
|
+
jobs:
|
|
103
|
+
actions:
|
|
104
|
+
confirm_destroy: Bu işi silmek istediğinizden emin misiniz?
|
|
105
|
+
confirm_discard: Bu işi iptal etmek istediğinizden emin misiniz?
|
|
106
|
+
confirm_reschedule: Bu işi yeniden planlamak istediğinizden emin misiniz?
|
|
107
|
+
confirm_retry: Bu işi tekrar denemek istediğinizden emin misiniz?
|
|
108
|
+
destroy: İşi Sil
|
|
109
|
+
discard: İşi İptal Et
|
|
110
|
+
reschedule: İşi Yeniden Planla
|
|
111
|
+
retry: İşi Tekrar Dene
|
|
112
|
+
destroy:
|
|
113
|
+
notice: İş Silindi
|
|
114
|
+
discard:
|
|
115
|
+
notice: İş İptal Edildi
|
|
116
|
+
executions:
|
|
117
|
+
error: Hata
|
|
118
|
+
in_queue: sırada
|
|
119
|
+
runtime: çalışma süresi
|
|
120
|
+
title: İşlemler
|
|
121
|
+
index:
|
|
122
|
+
job_pagination: İş sayfalandırması
|
|
123
|
+
older_jobs: Daha eski işler
|
|
124
|
+
reschedule:
|
|
125
|
+
notice: İş yeniden planlandı
|
|
126
|
+
retry:
|
|
127
|
+
notice: İş tekrar deneniyor
|
|
128
|
+
show:
|
|
129
|
+
jobs: İşler
|
|
130
|
+
table:
|
|
131
|
+
actions:
|
|
132
|
+
apply_to_all:
|
|
133
|
+
one: 1 işe uygula.
|
|
134
|
+
other: "%{count} işe uygula."
|
|
135
|
+
confirm_destroy_all: Seçili işleri silmek istediğinizden emin misiniz?
|
|
136
|
+
confirm_discard_all: Seçili işleri iptal etmek istediğinizden emin misiniz?
|
|
137
|
+
confirm_reschedule_all: Seçili işleri yeniden planlamak istediğinizden emin misiniz?
|
|
138
|
+
confirm_retry_all: Seçili işleri tekrar denemek istediğinizden emin misiniz?
|
|
139
|
+
destroy_all: Tümünü Sil
|
|
140
|
+
discard_all: Tümünü İptal Et
|
|
141
|
+
reschedule_all: Tümünü Yeniden Planla
|
|
142
|
+
retry_all: Tümünü Tekrar Dene
|
|
143
|
+
title: İşlemler
|
|
144
|
+
no_jobs_found: İş bulunamadı.
|
|
145
|
+
toggle_actions: İşlemleri Gizle/Göster
|
|
146
|
+
toggle_all_jobs: Tüm işleri Gizle/Göster
|
|
147
|
+
models:
|
|
148
|
+
batch:
|
|
149
|
+
created: Oluşturuldu
|
|
150
|
+
created_at: Oluşturma zamanı
|
|
151
|
+
discarded: İptal Edildi
|
|
152
|
+
discarded_at: İptal edilme zamanı
|
|
153
|
+
enqueued: Kuyruğa eklendi
|
|
154
|
+
enqueued_at: Kuyruğa ekleme zamanı
|
|
155
|
+
finished: Tamamlandı
|
|
156
|
+
finished_at: Tamamlanma zamanı
|
|
157
|
+
jobs: İşler
|
|
158
|
+
name: İsim
|
|
159
|
+
cron:
|
|
160
|
+
class: Sınıf
|
|
161
|
+
last_run: Son çalıştırma
|
|
162
|
+
next_scheduled: Sonraki planlama
|
|
163
|
+
schedule: Program
|
|
164
|
+
job:
|
|
165
|
+
arguments: Argümanlar
|
|
166
|
+
attempts: Denemeler
|
|
167
|
+
priority: Öncelik
|
|
168
|
+
queue: Kuyruk
|
|
169
|
+
number:
|
|
170
|
+
format:
|
|
171
|
+
delimiter: ","
|
|
172
|
+
separator: "."
|
|
173
|
+
human:
|
|
174
|
+
decimal_units:
|
|
175
|
+
delimiter: ","
|
|
176
|
+
format: "%n%u"
|
|
177
|
+
precision: 3
|
|
178
|
+
separator: "."
|
|
179
|
+
units:
|
|
180
|
+
billion: Milyar
|
|
181
|
+
million: Milyon
|
|
182
|
+
quadrillion: Katrilyon
|
|
183
|
+
thousand: Bin
|
|
184
|
+
trillion: Trilyon
|
|
185
|
+
unit: ''
|
|
186
|
+
processes:
|
|
187
|
+
index:
|
|
188
|
+
no_good_job_processes_found: GoodJob süreci bulunamadı.
|
|
189
|
+
process: Süreç
|
|
190
|
+
schedulers: Planlayıcılar
|
|
191
|
+
started: Başlangıç zamanı
|
|
192
|
+
title: Süreçler
|
|
193
|
+
updated: Güncellenmiş
|
|
194
|
+
shared:
|
|
195
|
+
filter:
|
|
196
|
+
all: Tümü
|
|
197
|
+
all_jobs: Tüm işler
|
|
198
|
+
all_queues: Tüm kuyruklar
|
|
199
|
+
clear: Temizle
|
|
200
|
+
job_name: İş adı
|
|
201
|
+
placeholder: Sınıfa, iş kimliğine, iş parametrelerine ve hata metnine göre ara.
|
|
202
|
+
queue_name: Kuyruk adı
|
|
203
|
+
search: Ara
|
|
204
|
+
footer:
|
|
205
|
+
last_update_html: Son güncelleme <time id="page-updated-at" datetime="%{time}">%{time}</time>
|
|
206
|
+
wording: Unutmayın, siz de iyi bir iş yapıyorsunuz!
|
|
207
|
+
navbar:
|
|
208
|
+
batches: Toplu İşler
|
|
209
|
+
cron_schedules: Cron
|
|
210
|
+
jobs: İşler
|
|
211
|
+
live_poll: Anlık Güncelleme
|
|
212
|
+
name: "GoodJob 👍"
|
|
213
|
+
processes: Süreçler
|
|
214
|
+
status:
|
|
215
|
+
discarded: İptal Edildi
|
|
216
|
+
queued: Sırada
|
|
217
|
+
retried: Tekrar deneniyor
|
|
218
|
+
running: Çalışıyor
|
|
219
|
+
scheduled: Planlandı
|
|
220
|
+
succeeded: Başarılı
|
data/config/locales/ua.yml
CHANGED
|
@@ -92,7 +92,7 @@ module GoodJob
|
|
|
92
92
|
key = self.class.good_job_concurrency_config[:key]
|
|
93
93
|
return if key.blank?
|
|
94
94
|
|
|
95
|
-
key = key.respond_to?(:call)
|
|
95
|
+
key = instance_exec(&key) if key.respond_to?(:call)
|
|
96
96
|
raise TypeError, "Concurrency key must be a String; was a #{key.class}" unless VALID_TYPES.any? { |type| key.is_a?(type) }
|
|
97
97
|
|
|
98
98
|
key
|
data/lib/good_job/capsule.rb
CHANGED
|
@@ -49,7 +49,7 @@ module GoodJob
|
|
|
49
49
|
# * +nil+ will trigger a shutdown but not wait for it to complete.
|
|
50
50
|
# @return [void]
|
|
51
51
|
def shutdown(timeout: :default)
|
|
52
|
-
timeout =
|
|
52
|
+
timeout = @configuration.shutdown_timeout if timeout == :default
|
|
53
53
|
GoodJob._shutdown_all([@notifier, @poller, @scheduler, @cron_manager].compact, timeout: timeout)
|
|
54
54
|
@startable = false
|
|
55
55
|
@running = false
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
module GoodJob # :nodoc:
|
|
4
4
|
class Notifier # :nodoc:
|
|
5
5
|
# Extends the Notifier to register the process in the database.
|
|
6
|
-
module
|
|
6
|
+
module ProcessHeartbeat
|
|
7
7
|
extend ActiveSupport::Concern
|
|
8
8
|
|
|
9
9
|
included do
|
|
10
10
|
set_callback :listen, :after, :register_process
|
|
11
|
+
set_callback :tick, :before, :refresh_process
|
|
11
12
|
set_callback :unlisten, :after, :deregister_process
|
|
12
13
|
end
|
|
13
14
|
|
|
@@ -19,6 +20,14 @@ module GoodJob # :nodoc:
|
|
|
19
20
|
end
|
|
20
21
|
end
|
|
21
22
|
|
|
23
|
+
def refresh_process
|
|
24
|
+
GoodJob::Process.with_connection(connection) do
|
|
25
|
+
Process.logger.silence do
|
|
26
|
+
@process&.refresh_if_stale(cleanup: true)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
22
31
|
# Deregisters the current process.
|
|
23
32
|
def deregister_process
|
|
24
33
|
GoodJob::Process.with_connection(connection) do
|
data/lib/good_job/notifier.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
|
3
3
|
require 'concurrent/atomic/atomic_boolean'
|
|
4
|
-
require "good_job/notifier/
|
|
4
|
+
require "good_job/notifier/process_heartbeat"
|
|
5
5
|
|
|
6
6
|
module GoodJob # :nodoc:
|
|
7
7
|
#
|
|
@@ -13,9 +13,9 @@ module GoodJob # :nodoc:
|
|
|
13
13
|
#
|
|
14
14
|
class Notifier
|
|
15
15
|
include ActiveSupport::Callbacks
|
|
16
|
-
define_callbacks :listen, :unlisten
|
|
16
|
+
define_callbacks :listen, :tick, :unlisten
|
|
17
17
|
|
|
18
|
-
include
|
|
18
|
+
include ProcessHeartbeat
|
|
19
19
|
|
|
20
20
|
# Default Postgres channel for LISTEN/NOTIFY
|
|
21
21
|
CHANNEL = 'good_job'
|
|
@@ -189,18 +189,20 @@ module GoodJob # :nodoc:
|
|
|
189
189
|
end
|
|
190
190
|
|
|
191
191
|
while thr_executor.running?
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
192
|
+
run_callbacks :tick do
|
|
193
|
+
wait_for_notify do |channel, payload|
|
|
194
|
+
next unless channel == CHANNEL
|
|
195
|
+
|
|
196
|
+
ActiveSupport::Notifications.instrument("notifier_notified.good_job", { payload: payload })
|
|
197
|
+
parsed_payload = JSON.parse(payload, symbolize_names: true)
|
|
198
|
+
thr_recipients.each do |recipient|
|
|
199
|
+
target, method_name = recipient.is_a?(Array) ? recipient : [recipient, :call]
|
|
200
|
+
target.send(method_name, parsed_payload)
|
|
201
|
+
end
|
|
200
202
|
end
|
|
201
|
-
end
|
|
202
203
|
|
|
203
|
-
|
|
204
|
+
reset_connection_errors
|
|
205
|
+
end
|
|
204
206
|
end
|
|
205
207
|
end
|
|
206
208
|
ensure
|
data/lib/good_job/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: good_job
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.15.
|
|
4
|
+
version: 3.15.14
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ben Sheldon
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-07-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activejob
|
|
@@ -393,6 +393,7 @@ files:
|
|
|
393
393
|
- config/locales/ja.yml
|
|
394
394
|
- config/locales/nl.yml
|
|
395
395
|
- config/locales/ru.yml
|
|
396
|
+
- config/locales/tr.yml
|
|
396
397
|
- config/locales/ua.yml
|
|
397
398
|
- config/routes.rb
|
|
398
399
|
- exe/good_job
|
|
@@ -427,7 +428,7 @@ files:
|
|
|
427
428
|
- lib/good_job/log_subscriber.rb
|
|
428
429
|
- lib/good_job/multi_scheduler.rb
|
|
429
430
|
- lib/good_job/notifier.rb
|
|
430
|
-
- lib/good_job/notifier/
|
|
431
|
+
- lib/good_job/notifier/process_heartbeat.rb
|
|
431
432
|
- lib/good_job/poller.rb
|
|
432
433
|
- lib/good_job/probe_server.rb
|
|
433
434
|
- lib/good_job/scheduler.rb
|