‪TYPO3CMS  ‪main
StopWorkerOnTimeLimitListener.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Log\LoggerInterface;
21 use Symfony\Component\Messenger\Event\WorkerRunningEvent;
22 use Symfony\Component\Messenger\Event\WorkerStartedEvent;
23 use Symfony\Component\Messenger\Exception\InvalidArgumentException;
25 
32 {
33  private float ‪$endTime = 0;
34 
35  private bool ‪$stopped = false;
36 
37  public function ‪__construct(
38  private readonly int $timeLimitInSeconds = 60 * 60, // 1 hour
39  private readonly ?LoggerInterface $logger = null
40  ) {
41  if ($timeLimitInSeconds <= 0) {
42  throw new InvalidArgumentException('Time limit must be greater than zero.', 1631254000);
43  }
44  }
45 
46  #[AsEventListener('messenger-stopontime-on-worker-started')]
47  public function ‪onWorkerStarted(WorkerStartedEvent $event): void
48  {
49  $startTime = microtime(true);
50  $this->endTime = $startTime + $this->timeLimitInSeconds;
51  }
52 
53  #[AsEventListener('messenger-stopontime-on-worker-running')]
54  public function ‪onWorkerRunning(WorkerRunningEvent $event): void
55  {
56  if ($this->endTime < microtime(true)) {
57  $event->getWorker()->stop();
58  $this->logger?->info('Worker stopped due to time limit of {timeLimit}s exceeded', ['timeLimit' => $this->timeLimitInSeconds]);
59  $this->stopped = true;
60  }
61  }
62 
63  public function ‪hasStopped(): bool
64  {
65  return ‪$this->stopped;
66  }
67 }
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener\$stopped
‪bool $stopped
Definition: StopWorkerOnTimeLimitListener.php:35
‪TYPO3\CMS\Core\Attribute\AsEventListener
Definition: AsEventListener.php:25
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener\__construct
‪__construct(private readonly int $timeLimitInSeconds=60 *60, private readonly ?LoggerInterface $logger=null)
Definition: StopWorkerOnTimeLimitListener.php:37
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener\$endTime
‪float $endTime
Definition: StopWorkerOnTimeLimitListener.php:33
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener\onWorkerRunning
‪onWorkerRunning(WorkerRunningEvent $event)
Definition: StopWorkerOnTimeLimitListener.php:54
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener\hasStopped
‪hasStopped()
Definition: StopWorkerOnTimeLimitListener.php:63
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener
Definition: StopWorkerOnTimeLimitListener.php:32
‪TYPO3\CMS\Core\Messenger\EventListener
Definition: StopWorkerOnTimeLimitListener.php:18
‪TYPO3\CMS\Core\Messenger\EventListener\StopWorkerOnTimeLimitListener\onWorkerStarted
‪onWorkerStarted(WorkerStartedEvent $event)
Definition: StopWorkerOnTimeLimitListener.php:47