Symfony : JMS Job queue Bundle Job Listener

1.8k Views Asked by At

Is it possible to set up an Event Listener on Job Status Change from JMS-Job-Queue-Bundle in Symfony? I am trying to update my database when a job failed.

1

There are 1 best solutions below

4
Michael Sivolobov On BEST ANSWER

You need an Event dispatcher from Symfony. You can get it from container by name event_dispatcher:

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

Then you can register your event listener as a closure:

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
    }
});

Also you can create separate class for this Event listener and use it like this:

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

And your YourListener class must look like this:

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
        }
    }
}

Also if you have Symfony project you can use more convenient way. Just define your YourListener class in services.yml and tag it with tag kernel.event_listener:

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