我使用beanstalk-client-ruby在一个beanstald队列中处理多个worker请求。
为了测试的目的,工人从队列中取出一个作业后随机进入一个无限循环。
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
我自己找到了一个可行的解决方案:
- 预留作业
- 用job_id 创建一个新管道
- 将您的PID在体内的作业推送到新管
- 当发现超时时间> 0的作业时,从job_id队列中弹出pid任务。
- 杀死工人