2014-01-06 133 views
1

我是Beanstalk + Pheanstalk中的中間人。我正在使用Beanstalk開發我的核心部分(後臺進程)。毫無疑問,這是一款出色的工具,但我陷入了一種情況。我正在使用使用Yii框架的beanstalk。假設我有兩個工作A(Tube-A-Jobs)和B(Tube-B-Jobs),兩者都在不同的管子和工人身上。 B依賴於A. B可能會在A之前由工作人員首先獲取並且將開始處理。在這種情況下,我需要B延遲幾秒(120秒),直到A執行。Beanstalk + Pheanstalk延遲現有作業

據我所知,沒有任何直接的方式來延遲工作。爲此,您需要刪除作業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(); 

它會給你如下輸出,我們可以看到,魔豆是不是提供它從中獲取這份工作的管名。

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

我們知道,一個工人可以以N管(S)看,所以如果我想拖延這項工作,並希望在同一試管中放。我們如何找到工作的管子名稱?

謝謝...

回答

4

Beanstalkd不返回作業從工作本身來管,但可以查詢它 - 用命令「統計作業」。

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),然後運行「統計崗位」,爲ID,讓原來的管,以及其他信息。

Pheanstalk具有statsJob功能,即您通過作業(從reserve返回)。

如果還有其他任何你無法瞭解的特定工作,你總是可以把元信息放入工作本身。

+0

謝謝阿利斯特..偉大的幫助! –

2

找到了新的方法將作業放回到同一隊列中,並延遲一段時間。我們可以直接使用版本功能的pheanstalk庫。例如

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

這樣,我們並不需要找工作的實際管,可以節省併發問題,特別是在我的情況。

感謝您的幫助!