我是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管中观看,所以如果我想延迟这个工作并且想要放在同一个管子里面。我们怎样才能找到工作的管名?
...谢谢
答案 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);
这样,我们不需要找到作业的实际管道,并且可以节省并发问题,特别是在我的情况下。
感谢您的帮助!!!