Похоже, что Delayed_job внезапно ничего не делает?

#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 может захлебнуться. Итак, я перенес асинхронное поведение в отдельный, более простой класс, и все заработало.