2014-01-06 2 views
1

Я занимаюсь промежуточным звеном в Beanstalk + Pheanstalk. Я разрабатываю свою основную часть (фоновый процесс) с помощью Beanstalk. Это отличный инструмент, который, без сомнения, я застрял в одной ситуации. Я использую beanstalk, используя структуру Yii.Beanstalk + Pheanstalk Delay Existing Job

Предположим, у меня есть две работы A (Tube - A-Jobs) и B (Tube - B-Jobs), и оба находятся под разными трубами и рабочими. B зависит от A. Возможно, что B сначала получит работника до A и начнет процесс на нем. В этом случае мне нужно, чтобы B задерживался на несколько секунд (120 секунд) до тех пор, пока не исполнится A.

Насколько мне известно, нет прямого способа сделать задержку работы. Для этого вам нужно удалить задание B и вернуть обратно в ту же очередь с задержкой. Поправьте меня, если я ошибаюсь.

Теперь ситуация такова, что я не могу получить фактическое имя трубки в этом случае, потому что pheanstalk предоставляет только идентификатор задания и данные задания. Я вставив вам мой код ниже,

$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 трубке (ы), так что если я хочу, чтобы отложить эту работу и хочу поставить под одной пробиркой. Как мы можем найти название трубки?

Благодаря ...

ответ

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), а затем запустить «Статс-задание», для идентификатора, получения исходной трубы, а также другую информацию.

Pheanstalk имеет функцию statsJob, которую вы передаете в задание (возвращается с reserve).

Если есть что-то еще, что вы не можете получить о конкретной задаче, вы всегда можете поместить метаинформацию в саму работу.

+0

Спасибо Алистер .. Отличная помощь !! –

2

Нашел новый способ вернуть работу в ту же очередь с некоторым временем задержки. Мы можем использовать прямой релиз функция библиотеки pheanstalk. например

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

Таким образом, нам не нужно искать фактическую трубку и сохранять проблемы параллелизма, особенно в моем случае.

Спасибо за помощь!

 Смежные вопросы

  • Нет связанных вопросов^_^