Symfony:JMS 作业队列捆绑作业监听器

Symfony : JMS Job queue Bundle Job Listener

是否可以在 Symfony 中从 JMS-Job-Queue-Bundle 设置作业状态更改事件侦听器? 我正在尝试在作业失败时更新我的​​数据库。

您需要一个来自 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
    }
});

您也可以为此事件侦听器创建单独的 class 并像这样使用它:

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

而您的 YourListener class 必须如下所示:

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 项目,你可以使用更方便的方法。只需在 services.yml 中定义您的 YourListener class 并使用标签 kernel.event_listener:

进行标记
your_listener:
    class:      AppBundle\EventListener\YourListener
    tags:
        - { name: kernel.event_listener, event: jms_job_queue.job_state_change, method: onStateChange }