2

我为 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是我在启动时初始化的 Slack 的简单 API 客户端。

在我的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文档,但我认为它对我没有任何帮助。

4

2 回答 2

1

尝试$ 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
于 2019-09-25T02:11:26.377 回答
0

Sidekiq 的默认设置是重试失败的作业 25 次。因为作业不存在,所以它失败了……每次;Sidekiq 只知道作业失败(因为尝试执行不存在的作业会引发异常),因此将其标记为重试...... 25 次。因为您每分钟都在安排该作业,所以您可能有大量这些失败的作业排队等待重试。你可以:

  • 等待约 3 周以达到最大重试次数
  • 如果您为 Sidekiq 设置了 UI 页面,您可以在重试选项卡中查看和清除这些作业
  • 深入研究 Redis CLI 文档,找到一种识别这些特定作业并删除它们的方法(或者如果您不担心失去其他作业,则刷新整个内容)
于 2019-09-26T04:52:55.687 回答