#ruby-on-rails #heroku #delayed-job
#ruby-on-rails #heroku #отложенное задание
Вопрос:
Я размещаю свое приложение на Heroku, и у меня есть задача в scheduler.rake
файле (для вызова планировщиком Heroku):
task :send_recipe_summary => :environment do
puts "Calling send recipe summary slack message job..."
SendRecipeSummarySlackMessageJob.perform_later
puts "Done!"
end
Когда эта задача вызывается (планировщиком или в консоли), он сообщает, что задача ставится в очередь:
➜ Plant-as-Usual-2 git:(master) heroku run bundle exec rake send_recipe_summary
Running bundle exec rake send_recipe_summary on ⬢ plant-as-usual-2... up, run.5548 (Hobby)
Calling send recipe summary slack message job...
I, [2020-09-24T16:25:50.193685 #4] INFO -- : [ActiveJob] Enqueued SendRecipeSummarySlackMessageJob (Job ID: a4110651-a9fa-4030-96ef-db4caf64c7e5) to Async(default)
Done!
Однако в журналах задание не ставится в очередь, и сообщение Slack никогда не отправляется:
2020-09-24T16:25:35.913315 00:00 app[api]: Starting process with command `bundle exec rake send_recipe_summary` by user jonappleseed@email.com
2020-09-24T16:25:44.008993 00:00 heroku[run.5548]: Awaiting client
2020-09-24T16:25:44.039520 00:00 heroku[run.5548]: State changed from starting to up
2020-09-24T16:25:44.291580 00:00 heroku[run.5548]: Starting process with command `bundle exec rake send_recipe_summary`
2020-09-24T16:25:49.334067 00:00 app[worker.1]: D, [2020-09-24T16:25:49.333949 #4] DEBUG -- : [1m[36mDelayed::Backend::ActiveRecord::Job Load (1.5ms)[0m [1m[37mUPDATE "delayed_jobs" SET locked_at = '2020-09-24 16:25:49.331558', locked_by = 'host:9b1fc7b1-4107-427f-8f49-f058b41b7906 pid:4' WHERE id IN (SELECT "delayed_jobs"."id" FROM "delayed_jobs" WHERE ((run_at <= '2020-09-24 16:25:49.330595' AND (locked_at IS NULL OR locked_at < '2020-09-24 12:25:49.330627') OR locked_by = 'host:9b1fc7b1-4107-427f-8f49-f058b41b7906 pid:4') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *[0m
2020-09-24T16:25:53.372387 00:00 heroku[run.5548]: Process exited with status 0
2020-09-24T16:25:53.407641 00:00 heroku[run.5548]: State changed from up to complete
2020-09-24T16:26:49.394474 00:00 app[worker.1]: D, [2020-09-24T16:26:49.394376 #4] DEBUG -- : [1m[36mDelayed::Backend::ActiveRecord::Job Load (1.5ms)[0m [1m[37mUPDATE "delayed_jobs" SET locked_at = '2020-09-24 16:26:49.392377', locked_by = 'host:9b1fc7b1-4107-427f-8f49-f058b41b7906 pid:4' WHERE id IN (SELECT "delayed_jobs"."id" FROM "delayed_jobs" WHERE ((run_at <= '2020-09-24 16:26:49.391803' AND (locked_at IS NULL OR locked_at < '2020-09-24 12:26:49.391827') OR locked_by = 'host:9b1fc7b1-4107-427f-8f49-f058b41b7906 pid:4') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *[0m
Однако, если я запускаю само задание (а не задачу), все работает так, как ожидалось, и сообщение отправляется:
irb(main):002:0> SendRecipeSummarySlackMessageJob.perform_later
I, [2020-09-24T16:22:45.268729 #4] INFO -- : [ActiveJob] Enqueued SendRecipeSummarySlackMessageJob (Job ID: 8285bb7f-9646-42bb-9901-8d219ca1175c) to Async(default)
=> #<SendRecipeSummarySlackMessageJob:0x000055b1a768dfb8 @arguments=[], @job_id="8285bb7f-9646-42bb-9901-8d219ca1175c", @queue_name="default", @priority=nil, @executions=0, @exception_executions={}, @provider_job_id="c41cedd7-e5a5-4a7d-9e64-280d2ec81e1e">
irb(main):003:0> I, [2020-09-24T16:22:45.269348 #4] INFO -- : [ActiveJob] [SendRecipeSummarySlackMessageJob] [8285bb7f-9646-42bb-9901-8d219ca1175c] Performing SendRecipeSummarySlackMessageJob (Job ID: 8285bb7f-9646-42bb-9901-8d219ca1175c) from Async(default) enqueued at 2020-09-24T16:22:45Z
D, [2020-09-24T16:22:46.412105 #4] DEBUG -- : [ActiveJob] [SendRecipeSummarySlackMessageJob] [8285bb7f-9646-42bb-9901-8d219ca1175c] (1.5ms) SELECT COUNT(*) FROM "recipes" WHERE "recipes"."state" = $1 [["state", "awaiting_approval"]]
D, [2020-09-24T16:22:46.413683 #4] DEBUG -- : [ActiveJob] [SendRecipeSummarySlackMessageJob] [8285bb7f-9646-42bb-9901-8d219ca1175c] (1.0ms) SELECT COUNT(*) FROM "recipes" WHERE "recipes"."state" = $1 [["state", "incomplete"]]
I, [2020-09-24T16:22:46.415123 #4] INFO -- : [ActiveJob] [SendRecipeSummarySlackMessageJob] [8285bb7f-9646-42bb-9901-8d219ca1175c] Enqueued SendSlackMessageJob (Job ID: c640b706-9920-4639-a1a0-4c7dbec15c39) to Async(default) with arguments: "There are no recipes awaiting approval, and 1 incomplete recipe https://www.plantasusual.com/admin", {:nature=>"inform"}
I, [2020-09-24T16:22:46.415260 #4] INFO -- : [ActiveJob] [SendRecipeSummarySlackMessageJob] [8285bb7f-9646-42bb-9901-8d219ca1175c] Performed SendRecipeSummarySlackMessageJob (Job ID: 8285bb7f-9646-42bb-9901-8d219ca1175c) from Async(default) in 1145.43ms
I, [2020-09-24T16:22:46.415882 #4] INFO -- : [ActiveJob] [SendSlackMessageJob] [c640b706-9920-4639-a1a0-4c7dbec15c39] Performing SendSlackMessageJob (Job ID: c640b706-9920-4639-a1a0-4c7dbec15c39) from Async(default) enqueued at 2020-09-24T16:22:46Z with arguments: "There are no recipes awaiting approval, and 1 incomplete recipe https://www.plantasusual.com/admin", {:nature=>"inform"}
I, [2020-09-24T16:22:46.591446 #4] INFO -- : [ActiveJob] [SendSlackMessageJob] [c640b706-9920-4639-a1a0-4c7dbec15c39] Performed SendSlackMessageJob (Job ID: c640b706-9920-4639-a1a0-4c7dbec15c39) from Async(default) in 175.12ms
Кто-нибудь может помочь мне понять, почему задание выполняется должным образом при запуске с консоли, но не работает при запуске из планировщика?
Спасибо всем, кто может помочь!
Ответ №1:
Похоже, вы не включили worker на heroku bundle exec rake jobs:work
. Это платная услуга. перейдите: your_app> вкладка ресурсов и включите ее оттуда. эта ссылка может быть полезной
Комментарии:
1. Я пробовал это, но это ничего не дало. Как вы думаете, что происходит не так? У меня уже есть рабочий динамический модуль, постоянно работающий в фоновом режиме. В третьем блоке кода вы можете увидеть
2020-09-24T16:26:49.394474 00:00 app[worker.1]
строки. Когда я ставлю задание в очередьperform_later
, это рабочий, который их выполняет.2. вы перенесли миграции delayed_job?. Возможно, задания не сохраняются в базе данных
3. Да, я это сделал. Задания работают при обычном вызове, но не при вызове с помощью задачи Heroku.