【问题标题】:php-resque: How to kill a specific job?php-resque:如何杀死一个特定的工作?
【发布时间】:2018-08-29 18:38:03
【问题描述】:

我正在使用php-resque 库,可以使用以下代码创建和跟踪作业。

$token = Resque::enqueue('queue', 'Job', NULL, true);

$statusTracker = new Resque_Job_Status($token);
$status = $statusTracker->get();

但是鉴于enqueue方法返回的token,如何停止作业呢?

我在项目页面上找到了this,但它不使用作业令牌来停止作业,而是使用工人ID。

考虑到我可能有不止一名工作人员处于活动状态,我如何才能找到正在执行所请求工作的工作人员 ID?

【问题讨论】:

  • 你说的“被停止”是什么意思,你的意思是你不想像出队那样运行作业吗?
  • 嗯,是的,但是即使工人已经开始工作,出队也有效?或者它只适用于尚未执行的作业?
  • 您可以在作业中抛出异常,以便将其标记为“失败”。见:github.com/chrisboulton/php-resque#onfailure
  • 很抱歉,我没有说明我不想从内部停止工作。用例是用户启动了很长时间的作业,然后想要停止它。如何使用 resque 提供此功能?

标签: php php-resque


【解决方案1】:

据我所知,Resqueue 不支持“中止”或“停止”作业。 但是如果你能设法将取消操作保存在某种数据库中,你会没事的。您可以在 performAction() 中进行额外检查。类似的东西;

class My_Job {
    public function perform() {
        $wasCanceled = true;
        if( $wasCanceled ) {
            throw new Exception("Job was cancelled");
        }

        // Perform job stuff.
    }
}

最后但同样重要的是;如果在取消完成之前已经执行了作业,这可能并不总是有效..

【讨论】:

  • 这可行,但如果我的 perform 方法中有很多东西要执行,每个执行的操作附近都应该有一个检查(因为可以随时执行取消操作)。
  • 我建议你每次都做一些小工作;如果你不想这样,只需创建一个额外的函数来检查取消操作,所以你只需要调用 $this->wasCanceled() 几次!
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 2014-10-03
  • 2012-07-12
  • 1970-01-01
  • 2021-05-06
  • 2015-08-03
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多