From a95f22bf429f7a5bf870aa8a8987963dd25d8e3e Mon Sep 17 00:00:00 2001 From: kuaifan Date: Sun, 4 Jan 2026 07:33:43 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20ManticoreSyncTask?= =?UTF-8?q?=20=E7=9A=84=E5=8E=BB=E9=87=8D=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1=E6=8A=95=E9=80=92=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Observers/AbstractObserver.php | 33 ++++++++++++++++++++++++++++-- app/Tasks/ManticoreSyncTask.php | 32 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/app/Observers/AbstractObserver.php b/app/Observers/AbstractObserver.php index 2d60b4ab6..151488a81 100644 --- a/app/Observers/AbstractObserver.php +++ b/app/Observers/AbstractObserver.php @@ -3,17 +3,46 @@ namespace App\Observers; use Hhxsv5\LaravelS\Swoole\Task\Task; +use Illuminate\Support\Facades\Cache; class AbstractObserver { /** + * 任务去重窗口时间(秒) + * 同一个 action+id 在此时间内只投递一次 + */ + private const DEDUP_WINDOW = 10; + + /** + * 投递异步任务(带去重) + * * @param $task * @return void */ public static function taskDeliver($task) { - if (app()->bound('swoole')) { - Task::deliver($task); + if (!app()->bound('swoole')) { + return; } + + // 对 ManticoreSyncTask 进行去重 + if ($task instanceof \App\Tasks\ManticoreSyncTask) { + $action = $task->getAction(); + $dataId = $task->getDataId(); + + if ($action && $dataId) { + $cacheKey = "manticore_task:{$action}:{$dataId}"; + + // 如果已有相同任务在等待,跳过本次投递 + if (Cache::has($cacheKey)) { + return; + } + + // 标记任务已投递,? 秒后过期 + Cache::put($cacheKey, true, self::DEDUP_WINDOW); + } + } + + Task::deliver($task); } } diff --git a/app/Tasks/ManticoreSyncTask.php b/app/Tasks/ManticoreSyncTask.php index d001a0c46..9e6a25cc9 100644 --- a/app/Tasks/ManticoreSyncTask.php +++ b/app/Tasks/ManticoreSyncTask.php @@ -36,6 +36,38 @@ class ManticoreSyncTask extends AbstractTask $this->data = $data; } + /** + * 获取任务动作类型(用于去重) + * + * @return string|null + */ + public function getAction(): ?string + { + return $this->action; + } + + /** + * 获取数据ID(用于去重) + * + * @return int|null + */ + public function getDataId(): ?int + { + if (!is_array($this->data)) { + return null; + } + + // 根据不同的 action 类型提取对应的 ID + return $this->data['id'] + ?? $this->data['userid'] + ?? $this->data['file_id'] + ?? $this->data['project_id'] + ?? $this->data['task_id'] + ?? $this->data['msg_id'] + ?? $this->data['dialog_id'] + ?? null; + } + public function start() { if (!Apps::isInstalled("manticore")) {