Sidekiq停止一个单一的,正在运行的工作

Fig*_*edi 15 jobs cancellation sidekiq

因此,我需要以编程方式停止在Sidekiq(3.1.2)中运行的作业,而不是预定的作业.我确实阅读了API文档,但没有找到任何关于取消正在运行的作业的信息.这可能与sidekiq有关吗?

当这不可能直接实现时,我的想法是绕过这个,通过在调用信号时在作业中引发异常,然后从重试集中删除作业.这显然不是最佳选择.

提前致谢

Mik*_*ham 10

正确的,停止工作的唯一方法就是让工作停止.您的应用程序必须实现该逻辑.

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

  • 如果这种方法是安全的,你不认为Sidekiq会允许吗? (2认同)

AXE*_*abs 5

如果您知道长时间运行的作业的线程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
Run Code Online (Sandbox Code Playgroud)

您可以从sidekiq_pusher触发它:

bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID
Run Code Online (Sandbox Code Playgroud)

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