From e1e96d0c123d378d6aafec6960bb7f7af71b549e Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Thu, 6 Jun 2019 16:34:33 +0200 Subject: [PATCH] Reschedule bounce task [MAILPOET-2100] --- lib/Cron/Workers/Scheduler.php | 14 ++++++++ lib/Cron/Workers/SimpleWorker.php | 4 +++ .../Cron/Workers/SchedulerTest.php | 32 +++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index b425a2b79e..06021b45a0 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -122,6 +122,7 @@ class Scheduler { 'post notification set status to sending', ['newsletter_id' => $newsletter->id, 'task_id' => $queue->task_id] ); + $this->reScheduleBounceTask(); return true; } @@ -158,6 +159,7 @@ class Scheduler { $task->save(); // update newsletter status $newsletter->setStatus(Newsletter::STATUS_SENDING); + $this->reScheduleBounceTask(); return true; } @@ -233,6 +235,18 @@ class Scheduler { ScheduledTask::touchAllByIds($ids); } + private function reScheduleBounceTask() { + $bounce_tasks = Bounce::getScheduledTasks($future = true); + if (count($bounce_tasks)) { + $bounce_task = reset($bounce_tasks); + if (Carbon::createFromTimestamp(current_time('timestamp'))->addHour(42)->lessThan($bounce_task->scheduled_at)) { + $random_offset = rand(-6 * 60 * 60, 6 * 60 * 60); + $bounce_task->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp'))->addSecond((36 * 60 * 60) + $random_offset); + $bounce_task->save(); + } + } + } + static function getScheduledQueues() { return SendingTask::getScheduledQueues(self::TASK_BATCH_SIZE); } diff --git a/lib/Cron/Workers/SimpleWorker.php b/lib/Cron/Workers/SimpleWorker.php index 1eb4448c69..8b19179668 100644 --- a/lib/Cron/Workers/SimpleWorker.php +++ b/lib/Cron/Workers/SimpleWorker.php @@ -125,6 +125,10 @@ abstract class SimpleWorker { return $date; } + /** + * @param bool $future + * @return ScheduledTask[] + */ static function getScheduledTasks($future = false) { $dateWhere = ($future) ? 'whereGt' : 'whereLte'; $wp = new WPFunctions(); diff --git a/tests/integration/Cron/Workers/SchedulerTest.php b/tests/integration/Cron/Workers/SchedulerTest.php index f5825e5e2c..36f51aeb33 100644 --- a/tests/integration/Cron/Workers/SchedulerTest.php +++ b/tests/integration/Cron/Workers/SchedulerTest.php @@ -552,6 +552,38 @@ class SchedulerTest extends \MailPoetTest { $scheduler->process(); } + function testItReSchedulesBounceTask() { + $task = ScheduledTask::createOrUpdate([ + 'type' => 'bounce', + 'status' => ScheduledTask::STATUS_SCHEDULED, + 'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addMonths(1), + ]); + $newsletter = $this->_createNewsletter(Newsletter::TYPE_STANDARD, Newsletter::STATUS_DRAFT); + $queue = $this->_createQueue($newsletter->id); + $finder = $this->makeEmpty(SubscribersFinder::class); + $scheduler = new Scheduler($finder); + + $scheduler->processScheduledStandardNewsletter($newsletter, $queue); + $refetched_task = ScheduledTask::where('id', $task->id)->findOne(); + expect($refetched_task->scheduled_at)->lessThan(Carbon::createFromTimestamp(current_time('timestamp'))->addHours(42)); + } + + function testItDoesNotReSchedulesBounceTaskWhenSoon() { + $task = ScheduledTask::createOrUpdate([ + 'type' => 'bounce', + 'status' => ScheduledTask::STATUS_SCHEDULED, + 'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addMinute(5), + ]); + $newsletter = $this->_createNewsletter(Newsletter::TYPE_STANDARD, Newsletter::STATUS_DRAFT); + $queue = $this->_createQueue($newsletter->id); + $finder = $this->makeEmpty(SubscribersFinder::class); + $scheduler = new Scheduler($finder); + + $scheduler->processScheduledStandardNewsletter($newsletter, $queue); + $refetched_task = ScheduledTask::where('id', $task->id)->findOne(); + expect($refetched_task->scheduled_at)->lessThan(Carbon::createFromTimestamp(current_time('timestamp'))->addHours(1)); + } + function testItProcessesScheduledJobsWhenNewsletterIsScheduled() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_STANDARD, Newsletter::STATUS_SCHEDULED); $queue = $this->_createQueue($newsletter->id);