diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 384f388b80..d03805e315 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -5,6 +5,7 @@ namespace MailPoet\Cron\Workers; use Carbon\Carbon; use MailPoet\Cron\CronHelper; use MailPoet\Models\Newsletter; +use MailPoet\Models\ScheduledTask; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Segments\SubscribersFinder; @@ -29,6 +30,7 @@ class Scheduler { function process() { $scheduled_queues = self::getScheduledQueues(); if(!count($scheduled_queues)) return false; + $this->updateTasks($scheduled_queues); foreach($scheduled_queues as $i => $queue) { $newsletter = Newsletter::filter('filterWithOptions') ->findOne($queue->newsletter_id); @@ -177,6 +179,13 @@ class Scheduler { false; } + private function updateTasks(array $scheduled_queues) { + $ids = array_map(function ($queue) { + return $queue->task_id; + }, $scheduled_queues); + ScheduledTask::touchAllByIds($ids); + } + static function getScheduledQueues() { return SendingTask::getScheduledQueues(self::TASK_BATCH_SIZE); } diff --git a/lib/Models/ScheduledTask.php b/lib/Models/ScheduledTask.php index 4aa7ce32e0..525f896ce1 100644 --- a/lib/Models/ScheduledTask.php +++ b/lib/Models/ScheduledTask.php @@ -74,4 +74,12 @@ class ScheduledTask extends Model { parent::save(); return $this; } + + static function touchAllByIds(array $ids) { + ScheduledTask::rawExecute( + 'UPDATE `' . ScheduledTask::$_table . '`' . + 'SET `updated_at` = NOW() ' . + 'WHERE `id` IN (' . join(',', $ids) . ')' + ); + } } diff --git a/lib/Tasks/Sending.php b/lib/Tasks/Sending.php index 0cc44c4d2b..7cf7281f2f 100644 --- a/lib/Tasks/Sending.php +++ b/lib/Tasks/Sending.php @@ -227,6 +227,7 @@ class Sending { ->whereLte('scheduled_at', Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp'))) ->where('type', 'sending') ->whereNotEqual('status', ScheduledTask::STATUS_PAUSED) + ->orderByAsc('updated_at') ->limit($amount) ->findMany(); $result = array(); diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index 04d4985674..38b4109f5f 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -571,6 +571,20 @@ class SchedulerTest extends \MailPoetTest { $scheduler->process(); } + function testItUpdatesUpdateTime() { + $originalUpdated = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(5)->toDateTimeString(); + $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME, Newsletter::STATUS_DRAFT); + $queue = $this->_createQueue($newsletter->id); + $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); + $queue->updated_at = $originalUpdated; + $queue->save(); + $scheduler = new Scheduler(); + $scheduler->timer = microtime(true); + $scheduler->process(); + $newQueue = ScheduledTask::findOne($queue->task_id); + expect($newQueue->updated_at)->notEquals($originalUpdated); + } + function _createNewsletterSegment($newsletter_id, $segment_id) { $newsletter_segment = NewsletterSegment::create(); $newsletter_segment->newsletter_id = $newsletter_id; @@ -685,4 +699,4 @@ class SchedulerTest extends \MailPoetTest { \ORM::raw_execute('TRUNCATE ' . Segment::$_table); \ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); } -} \ No newline at end of file +} diff --git a/tests/unit/Tasks/SendingTest.php b/tests/unit/Tasks/SendingTest.php index a8373d7d00..ec770b67e1 100644 --- a/tests/unit/Tasks/SendingTest.php +++ b/tests/unit/Tasks/SendingTest.php @@ -176,6 +176,25 @@ class SendingTest extends \MailPoetTest { expect(SendingTask::getRunningQueues($amount))->count($amount); } + function testItGetsBatchOfRunningQueuesSortedByUpdatedTime() { + $this->_after(); + + $sending1 = $this->createNewSendingTask(['status' => ScheduledTask::STATUS_SCHEDULED]); + $sending1->updated_at = '2017-05-04 14:00:00'; + $sending1->save(); + $sending2 = $this->createNewSendingTask(['status' => ScheduledTask::STATUS_SCHEDULED]); + $sending2->updated_at = '2017-05-04 16:00:00'; + $sending2->save(); + $sending3 = $this->createNewSendingTask(['status' => ScheduledTask::STATUS_SCHEDULED]); + $sending3->updated_at = '2017-05-04 15:00:00'; + $sending3->save(); + + $queues = SendingTask::getScheduledQueues(3); + expect($queues[0]->task_id)->equals($sending1->id()); + expect($queues[1]->task_id)->equals($sending3->id()); + expect($queues[2]->task_id)->equals($sending2->id()); + } + function createNewNewsletter() { $newsletter = Newsletter::create(); $newsletter->type = Newsletter::TYPE_STANDARD;