Files
piratepoet/mailpoet/lib/Cron/DaemonActionSchedulerRunner.php
Rostislav Wolny 4d7f6f8c75 Use more effective method deactivation
This will cancel all jobs with one query. Instead of cancelling one by one.
In case that some action gets scheduled multiple times e.g. due a race condition
it will remove all jobs.
2022-10-13 14:21:43 +02:00

69 lines
2.0 KiB
PHP

<?php declare(strict_types=1);
namespace MailPoet\Cron;
use MailPoet\Cron\ActionScheduler\Actions\DaemonRun;
use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger;
use MailPoet\Cron\ActionScheduler\ActionScheduler;
use MailPoet\Cron\ActionScheduler\RemoteExecutorHandler;
use MailPoet\WP\Functions as WPFunctions;
class DaemonActionSchedulerRunner {
/** @var ActionScheduler */
private $actionScheduler;
/** @var RemoteExecutorHandler */
private $remoteExecutorHandler;
/** @var DaemonTrigger */
private $daemonTriggerAction;
/** @var DaemonRun */
private $daemonRunAction;
/** @var WPFunctions */
private $wp;
public function __construct(
ActionScheduler $actionScheduler,
RemoteExecutorHandler $remoteExecutorHandler,
DaemonTrigger $daemonTriggerAction,
DaemonRun $daemonRunAction,
WPFunctions $wp
) {
$this->actionScheduler = $actionScheduler;
$this->remoteExecutorHandler = $remoteExecutorHandler;
$this->daemonTriggerAction = $daemonTriggerAction;
$this->daemonRunAction = $daemonRunAction;
$this->wp = $wp;
}
public function init(bool $isActive = true): void {
if (!$isActive) {
$this->deactivateOnTrigger();
return;
}
$this->daemonRunAction->init();
$this->daemonTriggerAction->init();
$this->remoteExecutorHandler->init();
}
public function deactivate(): void {
$this->actionScheduler->unscheduleAllCronActions();
}
/**
* Unschedule all MailPoet actions when next "trigger" action is processed.
* Note: We can't unschedule the actions directly inside the trigger action itself,
* because the action is recurring and would reschedule itself anyway.
* We need do the deactivation after the action scheduler process finishes.
*/
private function deactivateOnTrigger(): void {
$this->wp->addAction(DaemonTrigger::NAME, [$this, 'deactivateAfterProcess']);
}
public function deactivateAfterProcess(): void {
$this->wp->addAction('action_scheduler_after_process_queue', [$this, 'deactivate']);
}
}