Sidekiq 停止一项正在运行的作业

问题描述 投票:0回答:3

因此,我需要以编程方式停止 Sidekiq (3.1.2) 中的一项running 作业,而不是预定的作业。我确实阅读了 API 文档,但没有真正找到有关取消正在运行的作业的任何内容。这可以用 sidekiq 实现吗?

当这不能直接实现时,我的想法是通过在调用信号时在作业中引发异常,然后从重试集中删除作业来规避此问题。但这显然不是最佳的。

提前致谢

jobs sidekiq cancellation
3个回答
15
投票

正确,停止作业的唯一方法是让作业自行停止。您的应用程序必须实现该逻辑。

https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job


6
投票

如果您知道长时间运行的作业的线程 ID,则可以从另一个任务终止它:

class ThreadLightly
  include Sidekiq::Worker

  def perform(tid)
    puts "I'm %s, and I'll be terminating TID: %s..." % [self.class, tid]
    Thread.list.each {|t|
      if t.object_id.to_s == tid
        puts "Goodbye %s!" % t
        t.exit
      end
    }
  end
end

您可以从sidekiq_pusher触发它:

bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID

您需要记录每个作业的 Thread.current.object_id,因为 UI 不显示它。另外,如果您运行分布式 sidekiqs,则需要运行此任务,直到它在同一实例上运行。


1
投票

使用 Sidekiq 仪表板。

停止运行作业的另一种方法是停止 Sidekiq 进程。

并且停止 sidekiq 进程需要一些时间。 如果 Sidekiq 进程停止,所有作业都在运行,将返回到

enqued
部分。所以如果你重新启动 sidekiq 进程,它会再次运行。

您需要删除 enqued 部分中的所有作业。您可以使用仪表板来完成此操作。或在 Rails 控制台上运行此类命令。

## queue_name = 'logger'
## Sidekiq::Queue.new(queue_name).each { |e| e.delete }

# e.g.
Sidekiq::Queue.new('logger').each { |e| e.delete }

或者...使用仪表板...

它将从所有作业队列中删除。 现在您可以重新启动 sidekiq 进程。

© www.soinside.com 2019 - 2024. All rights reserved.