good_job 3.22.0 → 3.23.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,55 +2,55 @@
2
2
  ru:
3
3
  good_job:
4
4
  actions:
5
- destroy: Разрушать
6
- discard: Отказаться
5
+ destroy: Удалить
6
+ discard: Отменить
7
7
  force_discard: Принудительно отменить
8
8
  inspect: Осмотреть
9
9
  reschedule: Перенести
10
10
  retry: Повторить попытку
11
11
  batches:
12
12
  index:
13
- older_batches: Старые партии
13
+ older_batches: Старые группы заданий
14
14
  pending_migrations: У GoodJob есть ожидающие миграции базы данных.
15
- title: Пакеты
15
+ title: Группы заданий
16
16
  jobs:
17
17
  actions:
18
- confirm_destroy: Вы уверены, что хотите уничтожить эту работу?
19
- confirm_discard: Вы уверены, что хотите отказаться от этого задания?
18
+ confirm_destroy: Вы уверены, что хотите удалить это задание?
19
+ confirm_discard: Вы уверены, что хотите отменить это задание?
20
20
  confirm_reschedule: Вы уверены, что хотите перенести это задание?
21
21
  confirm_retry: Вы уверены, что хотите повторить это задание?
22
- destroy: Уничтожить работу
22
+ destroy: Удалить задание
23
23
  discard: Отменить задание
24
24
  reschedule: Перенести задание
25
25
  retry: Повторить задание
26
26
  title: Действия
27
- no_jobs_found: Вакансий не найдено.
27
+ no_jobs_found: Заданий не найдено
28
28
  show:
29
29
  attributes: Атрибуты
30
- batched_jobs: Пакетные задания
31
- callback_jobs: Задания обратного вызова
30
+ batched_jobs: Группы заданий
31
+ callback_jobs: Коллбеки
32
32
  table:
33
- no_batches_found: Партии не найдены.
33
+ no_batches_found: Группы заданий не найдены.
34
34
  cron_entries:
35
35
  actions:
36
- confirm_disable: Вы уверены, что хотите отключить эту запись cron?
37
- confirm_enable: Вы уверены, что хотите подтвердить эту запись cron?
38
- confirm_enqueue: Вы уверены, что хотите поставить эту запись cron в очередь?
39
- disable: Отключить запись cron
40
- enable: Включить запись cron
41
- enqueue: Поставить в очередь запись cron сейчас
36
+ confirm_disable: Вы уверены, что хотите отключить эту задачу cron?
37
+ confirm_enable: Вы уверены, что хотите подтвердить эту задачу cron?
38
+ confirm_enqueue: Вы уверены, что хотите поставить эту задачу cron в очередь?
39
+ disable: Отключить задачу cron
40
+ enable: Включить задачу cron
41
+ enqueue: Поставить в очередь задачу cron сейчас
42
42
  disable:
43
- notice: Запись Cron отключена.
43
+ notice: Задача Cron отключена.
44
44
  enable:
45
- notice: Запись Cron включена.
45
+ notice: Задача Cron включена.
46
46
  enqueue:
47
- notice: Запись Cron поставлена в очередь.
47
+ notice: Задача Cron поставлена в очередь.
48
48
  index:
49
49
  no_cron_schedules_found: Расписания cron не найдены.
50
- title: Расписания Cron
51
- pending_migrations: Требуется отложенная миграция базы данных GoodJob.
50
+ title: Расписания cron
51
+ pending_migrations: У GoodJob есть ожидающие миграции базы данных.
52
52
  show:
53
- cron_entry_key: Ключ входа в Крон
53
+ cron_entry_key: Ключ cron-задания
54
54
  datetime:
55
55
  distance_in_words:
56
56
  about_x_hours:
@@ -73,7 +73,7 @@ ru:
73
73
  many: почти %{count} лет
74
74
  one: почти 1 год
75
75
  other: почти %{count} лет
76
- half_a_minute: полминуты
76
+ half_a_minute: 30 секунд
77
77
  less_than_x_minutes:
78
78
  few: меньше %{count} минут
79
79
  many: меньше %{count} минут
@@ -97,7 +97,7 @@ ru:
97
97
  x_minutes:
98
98
  few: "%{count} минуты"
99
99
  many: "%{count} минут"
100
- one: 1 минуту
100
+ one: 1 минута
101
101
  other: "%{count} минуты"
102
102
  x_months:
103
103
  few: "%{count} месяца"
@@ -107,7 +107,7 @@ ru:
107
107
  x_seconds:
108
108
  few: "%{count} секунды"
109
109
  many: "%{count} секунд"
110
- one: 1 секунду
110
+ one: 1 секунда
111
111
  other: "%{count} секунды"
112
112
  x_years:
113
113
  few: "%{count} года"
@@ -121,49 +121,47 @@ ru:
121
121
  minutes: "%{min}м %{sec}с"
122
122
  seconds: "%{sec}s"
123
123
  error_event:
124
- discarded: Отброшено
124
+ discarded: Отклонено
125
125
  handled: Обработано
126
126
  interrupted: Прервано
127
127
  retried: Повторная попытка
128
- retry_stopped: Повторить остановлено
129
- unhandled: необработанный
128
+ retry_stopped: Повторная попытка отменена
129
+ unhandled: Не обработано
130
130
  helpers:
131
131
  relative_time:
132
132
  future: в %{time}
133
133
  past: "%{time} назад"
134
134
  jobs:
135
135
  actions:
136
- confirm_destroy: Вы уверены, что хотите уничтожить задание?
137
- confirm_discard: Вы уверены, что хотите отказаться от задания?
138
- confirm_force_discard: 'Вы уверены, что хотите принудительно отменить это задание? Задание будет помечено как отброшенное, но выполняемое задание не будет остановлено, однако в случае сбоя оно не будет повторено.
139
-
140
- '
136
+ confirm_destroy: Вы уверены, что хотите удалить это задание?
137
+ confirm_discard: Вы уверены, что хотите отменить это задание?
138
+ confirm_force_discard: Вы уверены, что хотите принудительно отменить это задание? Задание будет помечено как отмененное, но выполняемое в настоящий момент задание не будет остановлено. В случае сбоя отмененное задание не будет повторено.
141
139
  confirm_reschedule: Вы уверены, что хотите перенести задание?
142
140
  confirm_retry: Вы уверены, что хотите повторить задание?
143
- destroy: Уничтожить работу
141
+ destroy: Удалить задание
144
142
  discard: Отменить задание
145
143
  force_discard: Принудительно отменить задание
146
144
  reschedule: Перенести задание
147
145
  retry: Повторить задание
148
146
  destroy:
149
- notice: Работа была уничтожена
147
+ notice: Задание было удалено
150
148
  discard:
151
- notice: Работа удалена
149
+ notice: Задание было отменено
152
150
  executions:
153
151
  in_queue: в очереди
154
152
  runtime: время выполнения
155
- title: Казни
153
+ title: Выполнение заданий
156
154
  force_discard:
157
- notice: Иов был принудительно отброшен. Он продолжит работу, но не будет повторяться в случае сбоя.
155
+ notice: Задание было принудительно отменено. Активное задание продолжит выполняться, но не будет повторно запущено в случае сбоя.
158
156
  index:
159
- job_pagination: Пагинация вакансий
160
- older_jobs: Старые рабочие места
157
+ job_pagination: Пагинация заданий
158
+ older_jobs: Старые задания
161
159
  reschedule:
162
- notice: Работа была перенесена
160
+ notice: Время исполнения задания было перенесено
163
161
  retry:
164
162
  notice: Задание было повторено
165
163
  show:
166
- jobs: Работа
164
+ jobs: Задания
167
165
  table:
168
166
  actions:
169
167
  apply_to_all:
@@ -171,40 +169,40 @@ ru:
171
169
  many: около %{count} часов
172
170
  one: около 1 часа
173
171
  other: около %{count} часа
174
- confirm_destroy_all: Вы уверены, что хотите уничтожить выбранные задания?
175
- confirm_discard_all: Вы действительно хотите отказаться от выбранных заданий?
176
- confirm_reschedule_all: Вы уверены, что хотите изменить расписание выбранных заданий?
172
+ confirm_destroy_all: Вы уверены, что хотите удалить выбранные задания?
173
+ confirm_discard_all: Вы действительно хотите отменить выбранные задания?
174
+ confirm_reschedule_all: Вы уверены, что хотите изменить время исполнения выбранных заданий?
177
175
  confirm_retry_all: Вы уверены, что хотите повторить выбранные задания?
178
- destroy_all: Уничтожить все
176
+ destroy_all: Удалить все
179
177
  discard_all: Отменить все
180
178
  reschedule_all: Перенести все
181
179
  retry_all: Повторить все
182
180
  title: Действия
183
- no_jobs_found: Вакансий не найдено.
181
+ no_jobs_found: Заданий не найдено.
184
182
  toggle_actions: Переключить действия
185
183
  toggle_all_jobs: Переключить все задания
186
184
  models:
187
185
  batch:
188
186
  created: Созданный
189
187
  created_at: Создан в
190
- discarded: Отброшено
191
- discarded_at: Отброшено в
192
- enqueued: В очереди
193
- enqueued_at: В очереди в
194
- finished: Законченный
195
- finished_at: Закончено в
196
- jobs: Работа
197
- name: Имя
188
+ discarded: Отмененный
189
+ discarded_at: Отмененный в
190
+ enqueued: Запланированный
191
+ enqueued_at: Запланированный в
192
+ finished: Завершенный
193
+ finished_at: Завершенный в
194
+ jobs: Задание
195
+ name: Название
198
196
  cron:
199
- class: Сорт
197
+ class: Класс
200
198
  last_run: Последний запуск
201
199
  next_scheduled: Следующий по расписанию
202
200
  schedule: Расписание
203
201
  job:
204
- arguments: Аргументы
202
+ arguments: Параметры
205
203
  attempts: Попытки
206
- priority: приоритет
207
- queue: Очередь
204
+ priority: Приоритет
205
+ queue: Очередь исполнения
208
206
  number:
209
207
  format:
210
208
  delimiter: " "
@@ -224,7 +222,7 @@ ru:
224
222
  unit: ''
225
223
  processes:
226
224
  index:
227
- cron_enabled: Крон включен
225
+ cron_enabled: Cron включен
228
226
  no_good_job_processes_found: Процессы GoodJob не найдены.
229
227
  process: Процесс
230
228
  schedulers: Планировщики
@@ -238,32 +236,32 @@ ru:
238
236
  error: Ошибка
239
237
  filter:
240
238
  all: Все
241
- all_jobs: Все вакансии
239
+ all_jobs: Все задания
242
240
  all_queues: Все очереди
243
- clear: Прозрачный
244
- job_name: Название работы
245
- placeholder: Поиск по классу, идентификатору задания, параметрам задания и тексту ошибки.
246
- queue_name: Имя очереди
241
+ clear: Очистить
242
+ job_name: Название задания
243
+ placeholder: Поиск по классу, идентификатору задания, параметрам задания или тексту ошибки.
244
+ queue_name: Название очереди
247
245
  search: Поиск
248
246
  navbar:
249
- batches: Batches
247
+ batches: Пакетные задания
250
248
  cron_schedules: Cron
251
- jobs: Задачи
252
- live_poll: Живой Опрос
249
+ jobs: Задания
250
+ live_poll: Обновления в реальном времени
253
251
  name: "GoodJob 👍"
254
252
  processes: Процессы
255
253
  theme:
256
254
  auto: Авто
257
255
  dark: Темный
258
- light: Свет
259
- theme: Тема
256
+ light: Светлая
257
+ theme: Тема офрмдления
260
258
  secondary_navbar:
261
- inspiration: Запомни, ты делаешь Good Job тоже!
259
+ inspiration: Благодаря вам Good Job становится лучше! Спасибо!
262
260
  last_updated: Последнее обновление
263
261
  status:
264
- discarded: Отброшено
262
+ discarded: Отменено
265
263
  queued: В очереди
266
264
  retried: Повторная попытка
267
- running: Бег
268
- scheduled: по расписанию
269
- succeeded: удалось
265
+ running: Исполняется
266
+ scheduled: Запланировано
267
+ succeeded: Успешно
@@ -80,6 +80,8 @@ class CreateGoodJobs < ActiveRecord::Migration<%= migration_version %>
80
80
  add_index :good_jobs, [:finished_at], where: "retried_good_job_id IS NULL AND finished_at IS NOT NULL", name: :index_good_jobs_jobs_on_finished_at
81
81
  add_index :good_jobs, [:priority, :created_at], order: { priority: "DESC NULLS LAST", created_at: :asc },
82
82
  where: "finished_at IS NULL", name: :index_good_jobs_jobs_on_priority_created_at_when_unfinished
83
+ add_index :good_jobs, [:priority, :created_at], order: { priority: "ASC NULLS LAST", created_at: :asc },
84
+ where: "finished_at IS NULL", name: :index_good_job_jobs_for_candidate_lookup
83
85
  add_index :good_jobs, [:batch_id], where: "batch_id IS NOT NULL"
84
86
  add_index :good_jobs, [:batch_callback_id], where: "batch_callback_id IS NOT NULL"
85
87
  add_index :good_jobs, :labels, using: :gin, where: "(labels IS NOT NULL)", name: :index_good_jobs_on_labels
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateIndexGoodJobJobsForCandidateLookup < ActiveRecord::Migration<%= migration_version %>
4
+ disable_ddl_transaction!
5
+
6
+ def change
7
+ reversible do |dir|
8
+ dir.up do
9
+ # Ensure this incremental update migration is idempotent
10
+ # with monolithic install migration.
11
+ return if connection.index_name_exists?(:good_jobs, :index_good_job_jobs_for_candidate_lookup)
12
+ end
13
+ end
14
+
15
+ add_index :good_jobs, [:priority, :created_at], order: { priority: "ASC NULLS LAST", created_at: :asc },
16
+ where: "finished_at IS NULL", name: :index_good_job_jobs_for_candidate_lookup,
17
+ algorithm: :concurrently
18
+ end
19
+ end
@@ -49,7 +49,7 @@ module GoodJob
49
49
  active_jobs = Array(active_jobs)
50
50
  return 0 if active_jobs.empty?
51
51
 
52
- Rails.application.reloader.wrap do
52
+ Rails.application.executor.wrap do
53
53
  current_time = Time.current
54
54
  executions = active_jobs.map do |active_job|
55
55
  GoodJob::Execution.build_for_enqueue(active_job).tap do |execution|
@@ -139,7 +139,7 @@ module GoodJob
139
139
  # job there to be enqueued using enqueue_all
140
140
  return if GoodJob::Bulk.capture(active_job, queue_adapter: self)
141
141
 
142
- Rails.application.reloader.wrap do
142
+ Rails.application.executor.wrap do
143
143
  will_execute_inline = execute_inline? && (scheduled_at.nil? || scheduled_at <= Time.current)
144
144
  execution = GoodJob::Execution.enqueue(
145
145
  active_job,
data/lib/good_job/cli.rb CHANGED
@@ -68,7 +68,7 @@ module GoodJob
68
68
  method_option :poll_interval,
69
69
  type: :numeric,
70
70
  banner: 'SECONDS',
71
- desc: "Interval between polls for available jobs in seconds (env var: GOOD_JOB_POLL_INTERVAL, default: 5)"
71
+ desc: "Interval between polls for available jobs in seconds (env var: GOOD_JOB_POLL_INTERVAL, default: 10)"
72
72
  method_option :max_cache,
73
73
  type: :numeric,
74
74
  banner: 'COUNT',
@@ -94,6 +94,9 @@ module GoodJob
94
94
  type: :numeric,
95
95
  banner: 'PORT',
96
96
  desc: "Port for http health check (env var: GOOD_JOB_PROBE_PORT, default: nil)"
97
+ method_option :probe_handler,
98
+ type: :string,
99
+ desc: "Use 'webrick' to use WEBrick to handle probe server requests which is Rack compliant, otherwise default server that is not Rack compliant is used. (env var: GOOD_JOB_PROBE_HANDLER, default: nil)"
97
100
  method_option :queue_select_limit,
98
101
  type: :numeric,
99
102
  banner: 'COUNT',
@@ -112,7 +115,7 @@ module GoodJob
112
115
  systemd.start
113
116
 
114
117
  if configuration.probe_port
115
- probe_server = GoodJob::ProbeServer.new(port: configuration.probe_port)
118
+ probe_server = GoodJob::ProbeServer.new(app: configuration.probe_app, port: configuration.probe_port, handler: configuration.probe_handler)
116
119
  probe_server.start
117
120
  end
118
121
 
@@ -342,10 +342,26 @@ module GoodJob
342
342
  end
343
343
 
344
344
  # Port of the probe server
345
- # @return [nil,Integer]
345
+ # @return [nil, Integer]
346
346
  def probe_port
347
- options[:probe_port] ||
347
+ (options[:probe_port] ||
348
348
  env['GOOD_JOB_PROBE_PORT']
349
+ )&.to_i
350
+ end
351
+
352
+ # Probe server handler
353
+ # @return [nil, Symbol]
354
+ def probe_handler
355
+ (options[:probe_handler] ||
356
+ rails_config[:probe_handler] ||
357
+ env['GOOD_JOB_PROBE_HANDLER']
358
+ )&.to_sym
359
+ end
360
+
361
+ # Rack compliant application to be run on the ProbeServer
362
+ # @return [nil, Class]
363
+ def probe_app
364
+ rails_config[:probe_app]
349
365
  end
350
366
 
351
367
  def enable_listen_notify
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GoodJob
4
+ class ProbeServer
5
+ class HealthcheckMiddleware
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ case Rack::Request.new(env).path
12
+ when '/', '/status'
13
+ [200, {}, ["OK"]]
14
+ when '/status/started'
15
+ started = GoodJob::Scheduler.instances.any? && GoodJob::Scheduler.instances.all?(&:running?)
16
+ started ? [200, {}, ["Started"]] : [503, {}, ["Not started"]]
17
+ when '/status/connected'
18
+ connected = GoodJob::Scheduler.instances.any? && GoodJob::Scheduler.instances.all?(&:running?) &&
19
+ GoodJob::Notifier.instances.any? && GoodJob::Notifier.instances.all?(&:connected?)
20
+ connected ? [200, {}, ["Connected"]] : [503, {}, ["Not connected"]]
21
+ else
22
+ @app.call(env)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GoodJob
4
+ class ProbeServer
5
+ module NotFoundApp
6
+ def self.call(_env)
7
+ [404, {}, ["Not found"]]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GoodJob
4
+ class ProbeServer
5
+ class SimpleHandler
6
+ SOCKET_READ_TIMEOUT = 5 # in seconds
7
+
8
+ def initialize(app, options = {})
9
+ @app = app
10
+ @port = options[:port]
11
+ @logger = options[:logger]
12
+
13
+ @running = Concurrent::AtomicBoolean.new(false)
14
+ end
15
+
16
+ def stop
17
+ @running.make_false
18
+ @server&.close
19
+ end
20
+
21
+ def running?
22
+ @running.true?
23
+ end
24
+
25
+ def build_future
26
+ Concurrent::Future.new { run }
27
+ end
28
+
29
+ private
30
+
31
+ def run
32
+ @running.make_true
33
+ start_server
34
+ handle_connections if @running.true?
35
+ rescue StandardError => e
36
+ @logger.error "Server encountered an error: #{e}"
37
+ ensure
38
+ stop
39
+ end
40
+
41
+ def start_server
42
+ @server = TCPServer.new('0.0.0.0', @port)
43
+ rescue StandardError => e
44
+ @logger.error "Failed to start server: #{e}"
45
+ @running.make_false
46
+ end
47
+
48
+ def handle_connections
49
+ while @running.true?
50
+ begin
51
+ ready_sockets, = IO.select([@server], nil, nil, SOCKET_READ_TIMEOUT)
52
+ next unless ready_sockets
53
+
54
+ client = @server.accept_nonblock
55
+ request = client.gets
56
+
57
+ if request
58
+ status, headers, body = @app.call(parse_request(request))
59
+ respond(client, status, headers, body)
60
+ end
61
+
62
+ client.close
63
+ rescue IO::WaitReadable, Errno::EINTR, Errno::EPIPE
64
+ retry
65
+ end
66
+ end
67
+ end
68
+
69
+ def parse_request(request)
70
+ method, full_path = request.split
71
+ path, query = full_path.split('?')
72
+ { 'REQUEST_METHOD' => method, 'PATH_INFO' => path, 'QUERY_STRING' => query || '' }
73
+ end
74
+
75
+ def respond(client, status, headers, body)
76
+ client.write "HTTP/1.1 #{status}\r\n"
77
+ headers.each { |key, value| client.write "#{key}: #{value}\r\n" }
78
+ client.write "\r\n"
79
+ body.each { |part| client.write part.to_s }
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GoodJob
4
+ class ProbeServer
5
+ class WebrickHandler
6
+ def initialize(app, options = {})
7
+ @app = app
8
+ @port = options[:port]
9
+ @logger = options[:logger]
10
+ @handler = ::Rack::Handler.get('webrick')
11
+ end
12
+
13
+ def stop
14
+ @handler&.shutdown
15
+ end
16
+
17
+ def running?
18
+ @handler&.instance_variable_get(:@server)&.status == :Running
19
+ end
20
+
21
+ def build_future
22
+ Concurrent::Future.new(args: [@handler, @port, GoodJob.logger]) do |thr_handler, thr_port, thr_logger|
23
+ thr_handler.run(@app, Port: thr_port, Host: '0.0.0.0', Logger: thr_logger, AccessLog: [])
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -8,13 +8,20 @@ module GoodJob
8
8
  GoodJob._on_thread_error(thread_error) if thread_error
9
9
  end
10
10
 
11
- def initialize(port:)
12
- @port = port
11
+ def self.default_app
12
+ ::Rack::Builder.new do
13
+ use GoodJob::ProbeServer::HealthcheckMiddleware
14
+ run GoodJob::ProbeServer::NotFoundApp
15
+ end
16
+ end
17
+
18
+ def initialize(port:, handler: nil, app: nil)
19
+ app ||= self.class.default_app
20
+ @handler = build_handler(port: port, handler: handler, app: app)
13
21
  end
14
22
 
15
23
  def start
16
- @handler = HttpServer.new(self, port: @port, logger: GoodJob.logger)
17
- @future = Concurrent::Future.new { @handler.run }
24
+ @future = @handler.build_future
18
25
  @future.add_observer(self.class, :task_observer)
19
26
  @future.execute
20
27
  end
@@ -28,19 +35,17 @@ module GoodJob
28
35
  @future&.value # wait for Future to exit
29
36
  end
30
37
 
31
- def call(env)
32
- case Rack::Request.new(env).path
33
- when '/', '/status'
34
- [200, {}, ["OK"]]
35
- when '/status/started'
36
- started = GoodJob::Scheduler.instances.any? && GoodJob::Scheduler.instances.all?(&:running?)
37
- started ? [200, {}, ["Started"]] : [503, {}, ["Not started"]]
38
- when '/status/connected'
39
- connected = GoodJob::Scheduler.instances.any? && GoodJob::Scheduler.instances.all?(&:running?) &&
40
- GoodJob::Notifier.instances.any? && GoodJob::Notifier.instances.all?(&:connected?)
41
- connected ? [200, {}, ["Connected"]] : [503, {}, ["Not connected"]]
38
+ def build_handler(port:, handler:, app:)
39
+ if handler == :webrick
40
+ begin
41
+ require 'webrick'
42
+ WebrickHandler.new(app, port: port, logger: GoodJob.logger)
43
+ rescue LoadError
44
+ GoodJob.logger.warn("WEBrick was requested as the probe server handler, but it's not in the load path. GoodJob doesn't keep WEBrick as a dependency, so you'll have to make sure its added to your Gemfile to make use of it. GoodJob will fallback to its own webserver in the meantime.")
45
+ SimpleHandler.new(app, port: port, logger: GoodJob.logger)
46
+ end
42
47
  else
43
- [404, {}, ["Not found"]]
48
+ SimpleHandler.new(app, port: port, logger: GoodJob.logger)
44
49
  end
45
50
  end
46
51
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GoodJob
4
4
  # GoodJob gem version.
5
- VERSION = '3.22.0'
5
+ VERSION = '3.23.0'
6
6
 
7
7
  # GoodJob version as Gem::Version object
8
8
  GEM_VERSION = Gem::Version.new(VERSION)
data/lib/good_job.rb CHANGED
@@ -32,8 +32,11 @@ require "good_job/log_subscriber"
32
32
  require "good_job/multi_scheduler"
33
33
  require "good_job/notifier"
34
34
  require "good_job/poller"
35
- require "good_job/http_server"
36
35
  require "good_job/probe_server"
36
+ require "good_job/probe_server/healthcheck_middleware"
37
+ require "good_job/probe_server/not_found_app"
38
+ require "good_job/probe_server/simple_handler"
39
+ require "good_job/probe_server/webrick_handler"
37
40
  require "good_job/scheduler"
38
41
  require "good_job/shared_executor"
39
42
  require "good_job/systemd_service"
@@ -247,7 +250,7 @@ module GoodJob
247
250
  loop do
248
251
  break if limit && iteration >= limit
249
252
 
250
- result = Rails.application.reloader.wrap { job_performer.next }
253
+ result = Rails.application.executor.wrap { job_performer.next }
251
254
  break unless result
252
255
  raise result.unhandled_error if result.unhandled_error
253
256
 
@@ -273,7 +276,7 @@ module GoodJob
273
276
  def self.migrated?
274
277
  # Always update with the most recent migration check
275
278
  GoodJob::Execution.reset_column_information
276
- GoodJob::Execution.active_job_id_index_removal_migrated?
279
+ GoodJob::Execution.candidate_lookup_index_migrated?
277
280
  end
278
281
 
279
282
  ActiveSupport.run_load_hooks(:good_job, self)