Internally the worker is built on the symfony event dispatcher. It dispatches three events, each carrying the worker instance:
| Event | Dispatched |
|---|---|
WorkerStartedEvent |
once, before the first iteration |
WorkerRunningEvent |
after every iteration |
WorkerStoppedEvent |
once, after the worker has stopped |
All limits are implemented as event subscribers
(StopWorkerOnIterationLimitListener, StopWorkerOnMemoryLimitListener,
StopWorkerOnTimeLimitListener, StopWorkerOnSigtermSignalListener),
so you can add your own stop conditions the same way:
use Patchlevel\Worker\Event\WorkerRunningEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class StopWorkerOnNewDeploymentListener implements EventSubscriberInterface
{
public function onWorkerRunning(WorkerRunningEvent $event): void
{
if (new_version_deployed()) {
$event->worker->stop();
}
}
public static function getSubscribedEvents(): array
{
return [WorkerRunningEvent::class => 'onWorkerRunning'];
}
}Pass your own event dispatcher to create to register additional listeners:
use Patchlevel\Worker\DefaultWorker;
use Symfony\Component\EventDispatcher\EventDispatcher;
$eventDispatcher = new EventDispatcher();
$eventDispatcher->addSubscriber(new StopWorkerOnNewDeploymentListener());
$worker = DefaultWorker::create(
$job,
['timeLimit' => 3600],
$logger,
$eventDispatcher,
);