#ruby-on-rails #ruby-on-rails-3 #delayed-job
#ruby-on-rails #ruby-on-rails-3 #отложенное задание
Вопрос:
У меня есть скребок, настроенный на использование delayed_job, чтобы он выполнялся в фоновом режиме.
class Scraper
def do_scrape
# do some scraping stuff
end
handle_asynchronously :do_scrape
end
Теперь я могу закомментировать handle_asynchronously
строку, открыть консоль и запустить scraper просто отлично. Он делает именно то, что я ожидаю от него.
Однако, когда я пытаюсь запустить scrape как отложенное задание, кажется, что оно вообще ничего не делает. Кроме того, похоже, что он также не регистрирует ничего важного.
Вот как выглядит мой журнал от постановки задания в очередь до запуска rake jobs:work
.
County Load (1.0ms) SELECT "counties".* FROM "counties" WHERE "counties"."name" = 'Fermanagh' LIMIT 1
(0.1ms) BEGIN
SQL (20.5ms) INSERT INTO "delayed_jobs" ("attempts", "created_at", "failed_at", "handler", "last_error", "locked_at", "locked_by", "priority", "run_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id" [["attempts", 0], ["created_at", Mon, 30 May 2011 21:19:25 UTC 00:00], ["failed_at", nil], ["handler", "---
# serialized object omitted for conciseness
nmethod_name: :refresh_listings_in_the_county_without_delaynargs: []nn"], ["last_error", nil], ["locked_at", nil], ["locked_by", nil], ["priority", 0], ["run_at", Mon, 30 May 2011 21:19:25 UTC 00:00], ["updated_at", Mon, 30 May 2011 21:19:25 UTC 00:00]]
(0.9ms) COMMIT
Delayed::Backend::ActiveRecord::Job Load (0.4ms) SELECT "delayed_jobs".* FROM "delayed_jobs" WHERE (locked_by = 'host:David-Tuites-MacBook-Pro.local pid:7743' AND locked_at > '2011-05-30 17:19:32.116511') LIMIT 1
(0.1ms) BEGIN
SQL (0.3ms) DELETE FROM "delayed_jobs" WHERE "delayed_jobs"."id" = $1 [["id", 42]]
(0.4ms) COMMIT
Как вы можете видеть, похоже, что он просто вставляет задание, а затем сразу удаляет его? Этот метод очистки должен занять как минимум несколько минут.
Хуже всего то, что прошлой ночью все работало идеально, и я не могу придумать ни одной вещи, которую я делаю по-другому. Я попытался установить gem на предыдущую версию, поскольку она была недавно обновлена, но, похоже, проблема не устранена.
Есть идеи?
Ответ №1:
Вы настроили свое отложенное задание на удаление неудачных заданий? Найдите следующую настройку в вашем инициализаторе:
Delayed::Worker.destroy_failed_jobs = true
Если да, то установите для него значение false и найдите в таблице delayed_jobs исключение, из-за которого произошел сбой, и продолжайте отладку.
Комментарии:
1. У меня вообще не было этого параметра, но я все равно ввел его и установил в false. Теперь мне это сказали
Job failed to load: allocator undefined for Proc. Handler
. Немного погуглив, я понял, что, возможно, я получаю эту ошибку, потому что задание, которое я пытаюсь отложить, слишком сложное, так что, думаю, я попытаюсь разобраться с этим. Спасибо.2. Я немного упростил ситуацию, и это, кажется, помогло.
3. @duckyfuzz Я получаю ту же ошибку, не могли бы вы объяснить, что вы имеете в виду, говоря, что задание, которое вы пытаетесь отложить, было «слишком сложным»? и как вы его упростили?
4. @DavidTuite я получаю ту же ошибку, не могли бы вы, пожалуйста, рассказать мне, что вы сделали для решения этой проблемы, это было бы очень полезно.
5. @abhas Это было давно, но, если я правильно помню, проблема заключалась в том, что DJ должен сериализовать экземпляр Scraper и сохранить его в базе данных. Если ваш класс Scraper большой и сложный, DJ может захлебнуться. Итак, я перенес асинхронное поведение в отдельный, более простой класс, и все заработало.