2015-12-07 3 views
0

Возможно ли настроить прослушиватель событий на изменение статуса задания из JMS-Job-Queue-Bundle в Symfony? Я пытаюсь обновить мою базу данных, когда работа завершилась неудачно.Symfony: JMS Job queue Bundle Job Listener

ответ

4

Вам нужен диспетчер событий из Symfony. Вы можете получить его из контейнера по имени event_dispatcher:

$dispatcher = $container->get('event_dispatcher'); 

Тогда вы можете зарегистрировать прослушиватель событий, как закрытие:

use JMS\JobQueueBundle\Event\StateChangeEvent; 
use JMS\JobQueueBundle\Entity\Job; 

$dispatcher->addListener('jms_job_queue.job_state_change', function (StateChangeEvent $event) { 
    if ($event->getNewState() == Job::STATE_FAILED) { 
     $job = $event->getJob(); 
     // do what you need here 
    } 
}); 

Также вы можете создать отдельный класс для этого слушателя событий и использовать его, как это :

$listener = new YourListener(); 
$dispatcher->addListener('jms_job_queue.job_state_change', array($listener, 'onStateChange')); 

И ваш YourListener класс должен выглядеть следующим образом:

use JMS\JobQueueBundle\Event\StateChangeEvent; 
use JMS\JobQueueBundle\Entity\Job; 

class YourListener 
{ 
    // ... 

    public function onStateChange(StateChangeEvent $event) 
    { 
     if ($event->getNewState() == Job::STATE_FAILED) { 
      $job = $event->getJob(); 
      // do what you need here 
     } 
    } 
} 

Также, если у вас есть проект Symfony, вы можете использовать более удобный способ. Просто определите YourListener класс в services.yml и пометить его с тегом kernel.event_listener:

your_listener: 
    class:  AppBundle\EventListener\YourListener 
    tags: 
     - { name: kernel.event_listener, event: jms_job_queue.job_state_change, method: onStateChange } 
+0

Спасибо, главная проблема заключалась в том, что я не мог найти имена событий работы. –

+0

Вы просто забыли в вашем примере suscriber в services.yml в том случае, если бы: my_bundle.job_status_change: класс: MyBundle \ EventListener \ YourListener теги: - {имя: kernel.event_listener, событие: jms_job_queue.job_state_change , метод: onStateChange} –

+0

О, извините. Я просто забыл, что вы используете Symfony. Я скоро обновлю ответ. –