Extract scheduling logic from SimpleWorker
[MAILPOET-2538]
This commit is contained in:
committed by
Jack Kitterhing
parent
59ac38cabd
commit
afecae15f5
41
lib/Cron/CronWorkerScheduler.php
Normal file
41
lib/Cron/CronWorkerScheduler.php
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Cron;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use MailPoet\Models\ScheduledTask;
|
||||||
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
|
class CronWorkerScheduler {
|
||||||
|
/** @var WPFunctions */
|
||||||
|
private $wp;
|
||||||
|
|
||||||
|
function __construct(WPFunctions $wp) {
|
||||||
|
$this->wp = $wp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function schedule($task_type, $next_run_date) {
|
||||||
|
$already_scheduled = ScheduledTask::where('type', $task_type)
|
||||||
|
->whereNull('deleted_at')
|
||||||
|
->where('status', ScheduledTask::STATUS_SCHEDULED)
|
||||||
|
->findMany();
|
||||||
|
if ($already_scheduled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$task = ScheduledTask::create();
|
||||||
|
$task->type = $task_type;
|
||||||
|
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
||||||
|
$task->priority = ScheduledTask::PRIORITY_LOW;
|
||||||
|
$task->scheduled_at = $next_run_date;
|
||||||
|
$task->save();
|
||||||
|
return $task;
|
||||||
|
}
|
||||||
|
|
||||||
|
function reschedule(ScheduledTask $task, $timeout) {
|
||||||
|
$scheduled_at = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
|
||||||
|
$task->scheduled_at = $scheduled_at->addMinutes($timeout);
|
||||||
|
$task->setExpr('updated_at', 'NOW()');
|
||||||
|
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
||||||
|
$task->save();
|
||||||
|
}
|
||||||
|
}
|
@@ -4,6 +4,7 @@ namespace MailPoet\Cron\Workers;
|
|||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use MailPoet\Cron\CronHelper;
|
use MailPoet\Cron\CronHelper;
|
||||||
|
use MailPoet\Cron\CronWorkerScheduler;
|
||||||
use MailPoet\DI\ContainerWrapper;
|
use MailPoet\DI\ContainerWrapper;
|
||||||
use MailPoet\Models\ScheduledTask;
|
use MailPoet\Models\ScheduledTask;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
@@ -22,6 +23,9 @@ abstract class SimpleWorker {
|
|||||||
/** @var CronHelper */
|
/** @var CronHelper */
|
||||||
protected $cron_helper;
|
protected $cron_helper;
|
||||||
|
|
||||||
|
/** @var CronWorkerScheduler */
|
||||||
|
protected $cron_worker_scheduler;
|
||||||
|
|
||||||
function __construct($timer = false) {
|
function __construct($timer = false) {
|
||||||
if (static::TASK_TYPE === null) {
|
if (static::TASK_TYPE === null) {
|
||||||
throw new \Exception('Constant TASK_TYPE is not defined on subclass ' . get_class($this));
|
throw new \Exception('Constant TASK_TYPE is not defined on subclass ' . get_class($this));
|
||||||
@@ -31,6 +35,7 @@ abstract class SimpleWorker {
|
|||||||
$this->cron_helper = ContainerWrapper::getInstance()->get(CronHelper::class);
|
$this->cron_helper = ContainerWrapper::getInstance()->get(CronHelper::class);
|
||||||
$this->cron_helper->enforceExecutionLimit($this->timer);
|
$this->cron_helper->enforceExecutionLimit($this->timer);
|
||||||
$this->wp = new WPFunctions();
|
$this->wp = new WPFunctions();
|
||||||
|
$this->cron_worker_scheduler = ContainerWrapper::getInstance()->get(CronWorkerScheduler::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkProcessingRequirements() {
|
function checkProcessingRequirements() {
|
||||||
@@ -76,20 +81,7 @@ abstract class SimpleWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function schedule() {
|
function schedule() {
|
||||||
$already_scheduled = ScheduledTask::where('type', static::TASK_TYPE)
|
$this->cron_worker_scheduler->schedule(static::TASK_TYPE, static::getNextRunDate());
|
||||||
->whereNull('deleted_at')
|
|
||||||
->where('status', ScheduledTask::STATUS_SCHEDULED)
|
|
||||||
->findMany();
|
|
||||||
if ($already_scheduled) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$task = ScheduledTask::create();
|
|
||||||
$task->type = static::TASK_TYPE;
|
|
||||||
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
|
||||||
$task->priority = ScheduledTask::PRIORITY_LOW;
|
|
||||||
$task->scheduled_at = $this->getNextRunDate();
|
|
||||||
$task->save();
|
|
||||||
return $task;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareTask(ScheduledTask $task) {
|
function prepareTask(ScheduledTask $task) {
|
||||||
@@ -149,11 +141,7 @@ abstract class SimpleWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function reschedule(ScheduledTask $task, $timeout) {
|
function reschedule(ScheduledTask $task, $timeout) {
|
||||||
$scheduled_at = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
|
$this->cron_worker_scheduler->reschedule($task, $timeout);
|
||||||
$task->scheduled_at = $scheduled_at->addMinutes($timeout);
|
|
||||||
$task->setExpr('updated_at', 'NOW()');
|
|
||||||
$task->status = ScheduledTask::STATUS_SCHEDULED;
|
|
||||||
$task->save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function isInProgress(ScheduledTask $task) {
|
private function isInProgress(ScheduledTask $task) {
|
||||||
|
@@ -128,6 +128,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
// Cron
|
// Cron
|
||||||
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
|
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true);
|
$container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\Cron\CronWorkerScheduler::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true);
|
$container->autowire(\MailPoet\Cron\Daemon::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true);
|
$container->autowire(\MailPoet\Cron\DaemonHttpRunner::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Cron\Supervisor::class)->setPublic(true);
|
$container->autowire(\MailPoet\Cron\Supervisor::class)->setPublic(true);
|
||||||
|
@@ -121,7 +121,10 @@ class SimpleWorkerTest extends \MailPoetTest {
|
|||||||
function testItCanInitBeforeProcessing() {
|
function testItCanInitBeforeProcessing() {
|
||||||
$worker = Stub::make(
|
$worker = Stub::make(
|
||||||
$this->worker,
|
$this->worker,
|
||||||
['init' => Expected::once()],
|
[
|
||||||
|
'init' => Expected::once(),
|
||||||
|
'schedule' => Expected::once(),
|
||||||
|
],
|
||||||
$this
|
$this
|
||||||
);
|
);
|
||||||
$worker->process();
|
$worker->process();
|
||||||
|
Reference in New Issue
Block a user