Sidekiq/Redis ставит в очередь несуществующее задание

Я создал простое тестовое задание для Sidekiq и добавил его в свой schedule.yml файл для Sidekiq Cron.

Вот моя тестовая работа:

module Slack
  class TestJob < ApplicationJob
    queue_as :default

    def perform(*args)
      begin
        SLACK_NOTIFIER.post(attachments: {"pretext": "test", "text": "hello"})
      rescue Exception => error
        puts error
      end
    end
  end
end

В SLACK_NOTIFIER вот простой клиент API для Slack, который я инициализирую при запуске.

И в моем schedule.yml:

test_job:
  cron: "* * * * *"
  class: "Slack::TestJob"
  queue: default
  description: "Test"

Поэтому я хотел, чтобы он запускался каждую минуту, и он работал именно так, как я ожидал.

Однако теперь я удалил файл задания и удалил задание из schedule.yml, и он по-прежнему пытается выполнить задание каждую минуту. Я зашел в панель управления sidekiq и вижу несколько повторных попыток выполнения этой работы. Независимо от того, сколько раз я их всех убивал, они продолжают приходить.

Я несколько раз пытался выключить сервер Redis и sidekiq. Я пробовал выключить свой компьютер (конечно, после убийства серверов). Он по-прежнему планирует эти задания и прерывает другие мои задания, потому что вызывает следующее исключение:

NameError: uninitialized constant Slack::TestJob

Я выполнил поиск "TestJob" по всему проекту, но результатов не получил.

У меня был открытый сервер Redis с этой работой примерно на 10 минут...

Может быть, что-то осталось в базе данных Redis? Я заглянул вredis-cli документацию, но я не думаю, что это мне поможет.

2 ответа

Решение

Попробуйте позвонить $ FLUSHALL в Redis cli...

Кроме этого...

Документация sidekiq-cron, похоже, предполагает, что вы проверяете наличиеschedule.yml явно...

#initializers/sidekiq.rb
schedule_file = "config/schedule.yml"

if File.exist?(schedule_file) && Sidekiq.server?
  Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
end

По умолчанию Sidekiq повторяет неудачное задание 25 раз. Поскольку работы не существует, она терпит неудачу... каждый раз; Sidekiq знает только о том, что задание не выполнено (поскольку попытка выполнить несуществующее задание вызовет исключение), поэтому он помечает его для повторной попытки... 25 раз. Поскольку вы планировали это задание каждую минуту, у вас, вероятно, была ТОННА этих неудачных заданий в очереди для повторной попытки. Вы можете:

  • Подождите ~3 недели, чтобы достичь максимального количества повторных попыток
  • Если у вас настроена страница пользовательского интерфейса для Sidekiq, вы можете просмотреть и удалить эти задания на вкладке "Повторные попытки".
  • Изучите документацию Redis CLI, чтобы найти способ определить эти конкретные задания и удалить их (или очистить все это, если вы не беспокоитесь о потере других заданий)
Другие вопросы по тегам