Beanstalk + Pheanstalk延迟现有工作

时间:2014-01-06 09:49:01

标签: php yii beanstalkd pheanstalk

我是Beanstalk + Pheanstalk的中间人。我正在使用Beanstalk开发我的核心部分(后台进程)。这是一个很好的工具,毫无疑问,但我陷入了一种情况。我正在使用使用Yii框架的beanstalk。

让我们说,我有两份工作A(Tube-A-Jobs)和B(Tube-B-Jobs),两人都在不同的管和工人之间。 B依赖于A.可能B将在A之前由工作人员首先获取并且将开始对其进行处理。在那种情况下,我需要B延迟几秒钟(120秒),直到A将执行。

据我所知,没有任何直接的方法来延迟工作。为此,您需要删除作业B并将其延迟到具有延迟时间的相同队列。如果我在这里错了,请纠正我。

现在的情况是,在这种情况下,我无法获得实际的管名,因为pheanstalk仅提供作业ID和作业数据。我在下面粘贴你的代码,

$pheanstalkA = Yii::app()->beanstalk->getClient($client);
$pheanstalkA->watch('A-tube');

$pheanstalkB = Yii::app()->beanstalk->getClient($client);
$pheanstalkB->watch('B-tube');

现在,如果我有任何使用保留功能的工作,

$jobB = $pheanstalkB->reserve();

它将为您提供如下输出,我们可以看到beanstalk没有提供从中获取此作业的管名。

Pheanstalk_Job Object
(
    [_id:Pheanstalk_Job:private] => 2
    [_data:Pheanstalk_Job:private] => Job Data ....
)

正如我们所知,单个工人可以在N管中观看,所以如果我想延迟这个工作并且想要放在同一个管子里面。我们怎样才能找到工作的管名?

...谢谢

2 个答案:

答案 0 :(得分:4)

Beanstalkd并没有通过作业本身返回作业来自的管道,但您可以使用命令' stats-job'来查询它。

put 1 0 100 5
hello
INSERTED 10

reserve
RESERVED 10 5
hello

stats-job 10
OK 143
---
id: 10
tube: default
state: reserved
pri: 1
age: 33
delay: 0
ttr: 100
time-left: 82
reserves: 1
timeouts: 0
releases: 0
buries: 0
kicks: 0

我放了一份简单的工作,保留它(然后取回工作ID:10),然后运行' stats-job',获取id,获取原始管和其他信息。

Pheanstalk具有statsJob函数,您传递的作业(从reserve返回)。

如果还有其他任何事情无法解决某项工作,您可以随时将元信息放入工作中。

答案 1 :(得分:3)

找到一种新的方法将作业放回同一队列并延迟一段时间。我们可以使用pheanstalk库的直接发布功能。例如

    $this->pheanstalk->release($job,$priority,$delay);

这样,我们不需要找到作业的实际管道,并且可以节省并发问题,特别是在我的情况下。

感谢您的帮助!!!