From 38132ac9f7076d1edef291ff36bc3e2d47025952 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 1 Feb 2022 23:22:31 -0800 Subject: [PATCH] CRM_Queue_Queue_* - Respect `$queueSpec['retry_interval']` (if given) Background: * A queue runner should call `releaseItem()` if it tries and aborts some task. * The `retry_interval` is defined as the extra time to wait before trying again. Before: The `releaseItem()` always releases for immediate execution. After: The `releaseItem()` checks `retry_interval`. If it's set, then it will add an extra delay before retrying. --- CRM/Queue/Queue/Memory.php | 8 +++++++- CRM/Queue/Queue/SqlTrait.php | 16 +++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CRM/Queue/Queue/Memory.php b/CRM/Queue/Queue/Memory.php index abe8ee1236..46573a016d 100644 --- a/CRM/Queue/Queue/Memory.php +++ b/CRM/Queue/Queue/Memory.php @@ -204,7 +204,13 @@ class CRM_Queue_Queue_Memory extends CRM_Queue_Queue { * The item returned by claimItem. */ public function releaseItem($item) { - unset($this->releaseTimes[$item->id]); + if (empty($this->queueSpec['retry_interval'])) { + unset($this->releaseTimes[$item->id]); + } + else { + $nowEpoch = CRM_Utils_Time::getTimeRaw(); + $this->releaseTimes[$item->id] = $nowEpoch + $this->queueSpec['retry_interval']; + } } } diff --git a/CRM/Queue/Queue/SqlTrait.php b/CRM/Queue/Queue/SqlTrait.php index 19d3648e76..40a9ad6002 100644 --- a/CRM/Queue/Queue/SqlTrait.php +++ b/CRM/Queue/Queue/SqlTrait.php @@ -121,11 +121,17 @@ trait CRM_Queue_Queue_SqlTrait { * The item returned by claimItem. */ public function releaseItem($dao) { - $sql = "UPDATE civicrm_queue_item SET release_time = NULL WHERE id = %1"; - $params = [ - 1 => [$dao->id, 'Integer'], - ]; - CRM_Core_DAO::executeQuery($sql, $params); + if (empty($this->queueSpec['retry_interval'])) { + CRM_Core_DAO::executeQuery('UPDATE civicrm_queue_item SET release_time = NULL WHERE id = %1', [ + 1 => [$dao->id, 'Integer'], + ]); + } + else { + CRM_Core_DAO::executeQuery('UPDATE civicrm_queue_item SET release_time = DATE_ADD(NOW(), INTERVAL %2 SECOND) WHERE id = %1', [ + 1 => [$dao->id, 'Integer'], + 2 => [$this->queueSpec['retry_interval'], 'Integer'], + ]); + } $dao->free(); } -- 2.25.1