检测哪个工作人员将TTR过期的作业返回到队列?

时间:2011-09-14 17:54:16

标签: ruby beanstalkd

我有多个worker使用beanstalk-client-ruby处理beanstalkd队列中的请求。

出于测试目的,工作人员在从队列中取出作业后随机潜入无限循环。

Beanstalk注意到作业已被保留太长时间并将其返回队列以供其他工作人员处理。

我怎么能发现这种情况已经发生,以便我可以杀死故障工人?

看起来我可以检测到发生了超时:

> job.timeouts
 => 0
> sleep 10
 => nil
> job.timeouts
 => 1

现在我怎么能这样:

> job=queue.reserve
 => 189
> job.MAGICAL_INFO_STORE[:previous_worker_pid] = $$
 => extraordinary magic happened
> sleep 10
 => nil
> job=queue.reserve
 => 189
> job.timeouts
 => 1
> kill_the_sucker(job.MAGICAL_INFO_STORE[:previous_worker_pid])
 => nil

1 个答案:

答案 0 :(得分:0)

自己找到了一个有效的解决方案:

  1. 预约工作
  2. 使用job_id
  3. 设置新电子管
  4. 将身体中的PID推送到新管
  5. 当有超时的工作时>找到0,从job_id队列中弹出PID任务。
  6. 杀死工人