Extract scheduling logic from SimpleWorker

[MAILPOET-2538]
This commit is contained in:
Jan Jakeš
2019-11-19 11:19:20 +01:00
committed by Jack Kitterhing
parent 59ac38cabd
commit afecae15f5
4 changed files with 53 additions and 20 deletions

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

View File

@@ -4,6 +4,7 @@ namespace MailPoet\Cron\Workers;
use Carbon\Carbon;
use MailPoet\Cron\CronHelper;
use MailPoet\Cron\CronWorkerScheduler;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\ScheduledTask;
use MailPoet\WP\Functions as WPFunctions;
@@ -22,6 +23,9 @@ abstract class SimpleWorker {
/** @var CronHelper */
protected $cron_helper;
/** @var CronWorkerScheduler */
protected $cron_worker_scheduler;
function __construct($timer = false) {
if (static::TASK_TYPE === null) {
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->enforceExecutionLimit($this->timer);
$this->wp = new WPFunctions();
$this->cron_worker_scheduler = ContainerWrapper::getInstance()->get(CronWorkerScheduler::class);
}
function checkProcessingRequirements() {
@@ -76,20 +81,7 @@ abstract class SimpleWorker {
}
function schedule() {
$already_scheduled = ScheduledTask::where('type', static::TASK_TYPE)
->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;
$this->cron_worker_scheduler->schedule(static::TASK_TYPE, static::getNextRunDate());
}
function prepareTask(ScheduledTask $task) {
@@ -149,11 +141,7 @@ abstract class SimpleWorker {
}
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();
$this->cron_worker_scheduler->reschedule($task, $timeout);
}
private function isInProgress(ScheduledTask $task) {

View File

@@ -128,6 +128,7 @@ class ContainerConfigurator implements IContainerConfigurator {
// Cron
$container->autowire(\MailPoet\Cron\CronHelper::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\DaemonHttpRunner::class)->setPublic(true);
$container->autowire(\MailPoet\Cron\Supervisor::class)->setPublic(true);

View File

@@ -121,7 +121,10 @@ class SimpleWorkerTest extends \MailPoetTest {
function testItCanInitBeforeProcessing() {
$worker = Stub::make(
$this->worker,
['init' => Expected::once()],
[
'init' => Expected::once(),
'schedule' => Expected::once(),
],
$this
);
$worker->process();