From 3abbc86951b8f9daa1e4c9a3bd489964d00a37c7 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Mon, 13 Feb 2023 02:21:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=B0=83=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Kernel.php | 29 +++--- app/Jobs/Host/DispatchHostCostQueueJob.php | 28 ++++-- app/Jobs/Host/RealHostCostJob.php | 41 -------- app/Jobs/Host/SendRenewNotificationJob.php | 49 ++++++++++ app/Jobs/Module/DispatchFetchModuleJob.php | 95 ++++++++++++++++++- app/Jobs/Module/FetchModuleJob.php | 104 --------------------- 6 files changed, 173 insertions(+), 173 deletions(-) delete mode 100644 app/Jobs/Host/RealHostCostJob.php create mode 100644 app/Jobs/Host/SendRenewNotificationJob.php delete mode 100644 app/Jobs/Module/FetchModuleJob.php diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 90db5c2..4c6fdfa 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -21,45 +21,46 @@ class Kernel extends ConsoleKernel /** * Define the application's command schedule. * - * @param Schedule $schedule + * @param Schedule $schedule + * * @return void */ protected function schedule(Schedule $schedule): void { // 清理过期的 Token - $schedule->command('sanctum:prune-expired --hours=24')->daily()->runInBackground(); + $schedule->command('sanctum:prune-expired --hours=24')->daily()->runInBackground()->onOneServer()->name("清理过期的 Token。"); // 扣费 - $schedule->job(new DispatchHostCostQueueJob(now()->minute))->everyMinute()->withoutOverlapping()->onOneServer(); + $schedule->job(new DispatchHostCostQueueJob(now()->minute))->everyMinute()->withoutOverlapping()->onOneServer()->name("部署扣费任务"); // 获取模块暴露的信息(服务器等,检查模块状态) - $schedule->job(new DispatchFetchModuleJob())->withoutOverlapping()->everyMinute(); + $schedule->job(new DispatchFetchModuleJob())->withoutOverlapping()->everyMinute()->name("获取模块暴露的信息(服务器等,检查模块状态)"); // 推送工单 - $schedule->job(new PushWorkOrderJob())->everyMinute()->onOneServer(); + $schedule->job(new PushWorkOrderJob())->everyMinute()->onOneServer()->name("推送工单"); // 自动关闭工单 - $schedule->job(new AutoCloseWorkOrderJob())->everyMinute()->onOneServer(); + $schedule->job(new AutoCloseWorkOrderJob())->everyMinute()->onOneServer()->name("自动关闭工单"); // 清理任务 - $schedule->job(new ClearTasksJob())->weekly()->onOneServer(); + $schedule->job(new ClearTasksJob())->weekly()->onOneServer()->name("清理大于 1 天的任务"); // 删除暂停或部署时间超过 3 天以上的主机 - $schedule->job(new DeleteHostJob())->hourly()->onOneServer(); + $schedule->job(new DeleteHostJob())->hourly()->onOneServer()->name("删除暂停或部署时间超过 3 天以上的主机"); // 检查主机是否存在于模块 - $schedule->job(new ScanAllHostsJob())->everyThirtyMinutes()->withoutOverlapping()->onOneServer(); + $schedule->job(new ScanAllHostsJob())->everyThirtyMinutes()->withoutOverlapping()->onOneServer()->name("检查主机是否存在于模块"); // 检查未充值的订单,并充值 - $schedule->job(new CheckAndChargeBalanceJob())->everyFiveMinutes()->onOneServer()->withoutOverlapping(); + $schedule->job(new CheckAndChargeBalanceJob())->everyFiveMinutes()->onOneServer()->withoutOverlapping()->name("检查未充值的订单,并充值"); // 发送模块收益 - $schedule->job(new SendModuleEarningsJob())->dailyAt('20:00')->onOneServer(); + $schedule->job(new SendModuleEarningsJob())->dailyAt('20:00')->onOneServer()->name("发送模块收益"); // 回滚临时用户组 - $schedule->job(new RollbackUserTempGroupJob())->everyMinute()->onOneServer(); + $schedule->job(new RollbackUserTempGroupJob())->everyMinute()->onOneServer()->name("回滚临时用户组"); // 设置生日用户组 - $schedule->job(new SetBirthdayGroupJob())->dailyAt('00:00')->onOneServer(); + $schedule->job(new SetBirthdayGroupJob())->dailyAt('00:00')->onOneServer()->name("设置生日用户组"); } /** @@ -69,7 +70,7 @@ protected function schedule(Schedule $schedule): void */ protected function commands(): void { - $this->load(__DIR__.'/Commands'); + $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); } diff --git a/app/Jobs/Host/DispatchHostCostQueueJob.php b/app/Jobs/Host/DispatchHostCostQueueJob.php index 5190737..b0858c4 100644 --- a/app/Jobs/Host/DispatchHostCostQueueJob.php +++ b/app/Jobs/Host/DispatchHostCostQueueJob.php @@ -12,16 +12,20 @@ class DispatchHostCostQueueJob implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; - public int $minute; + protected int $minute; + protected ?Host $host; /** * Create a new job instance. * * @return void */ - public function __construct($minute) + public function __construct($minute, Host $host = null) { $this->minute = $minute; + $this->host = $host; + + $this->onQueue('host-cost'); } /** @@ -31,16 +35,20 @@ public function __construct($minute) */ public function handle(): void { - $host = new Host(); + if (!$this->host) { + $host = new Host(); - if (app()->environment() != 'local') { - $host = $host->where('minute_at', $this->minute); + if (app()->environment() != 'local') { + $host = $host->where('minute_at', $this->minute); + } + + $host->whereIn('status', ['running', 'stopped'])->with('user')->chunk(500, function ($hosts) { + foreach ($hosts as $host) { + dispatch(new self($this->minute, $host)); + } + }); } - $host->whereIn('status', ['running', 'stopped'])->with('user')->chunk(500, function ($hosts) { - foreach ($hosts as $host) { - dispatch(new RealHostCostJob($host, $host->getPrice()))->onQueue('host-cost'); - } - }); + $this->host?->cost($this->host->getPrice()); } } diff --git a/app/Jobs/Host/RealHostCostJob.php b/app/Jobs/Host/RealHostCostJob.php deleted file mode 100644 index a68bd55..0000000 --- a/app/Jobs/Host/RealHostCostJob.php +++ /dev/null @@ -1,41 +0,0 @@ -host = $host; - $this->price = $price; - } - - /** - * Execute the job. - * - * @return void - */ - public function handle(): void - { - $this->host->cost($this->price); - } -} diff --git a/app/Jobs/Host/SendRenewNotificationJob.php b/app/Jobs/Host/SendRenewNotificationJob.php new file mode 100644 index 0000000..38ebffe --- /dev/null +++ b/app/Jobs/Host/SendRenewNotificationJob.php @@ -0,0 +1,49 @@ +host = $host; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle(): void + { + if (!$this->host) { + // 获取 Host,距离今天刚好 7 天的 Host + Host::where('next_due_at', '>', now()->addDays(7)->startOfDay()) + ->where('next_due_at', '<', now()->addDays(7)->endOfDay()) + ->chunk(100, function ($hosts) { + foreach ($hosts as $host) { + dispatch(new self($host)); + } + }); + } + + $this->host?->user->notify(new UserNotification("续费提醒", "您的 {$this->host->name} 将在 7 天后到期,请及时续费。", true)); + } +} diff --git a/app/Jobs/Module/DispatchFetchModuleJob.php b/app/Jobs/Module/DispatchFetchModuleJob.php index 600a221..d6b71c0 100644 --- a/app/Jobs/Module/DispatchFetchModuleJob.php +++ b/app/Jobs/Module/DispatchFetchModuleJob.php @@ -3,15 +3,31 @@ namespace App\Jobs\Module; use App\Models\Module; +use Exception; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Log; class DispatchFetchModuleJob implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; + protected ?Module $module; + + /** + * Create a new job instance. + * + * @return void + */ + public function __construct(Module $module = null) + { + $this->module = $module; + } + + /** * Execute the job. * @@ -19,10 +35,81 @@ class DispatchFetchModuleJob implements ShouldQueue */ public function handle(): void { - (new Module)->whereNotNull('url')->chunk(100, function ($modules) { - foreach ($modules as $module) { - dispatch(new FetchModuleJob($module)); + if (!$this->module) { + (new Module)->whereNotNull('url')->chunk(100, function ($modules) { + foreach ($modules as $module) { + dispatch(new self($module)); + + } + }); + } + + if ($this->module) { + $module = $this->module; + + $servers = []; + + try { + $response = $module->http()->get('remote'); + } catch (Exception $e) { + Log::debug('无法连接到模块 - down: ' . $e->getMessage()); + + // 如果模块状态不为 down,则更新为 down + if ($module->status !== 'down') { + $module->status = 'down'; + $module->save(); + } + + return; } - }); + + if ($response->successful()) { + // 如果模块状态不为 up,则更新为 up + if ($module->status !== 'up') { + $module->status = 'up'; + Log::debug('模块状态更新为 up: ' . $module->name); + } + + $json = $response->json(); + + if (isset($json['servers']) && is_array($json['servers'])) { + // 只保留 name, status, meta + $servers = array_merge($servers, array_map(function ($server) use ($module) { + return [ + 'name' => $server['name'], + 'status' => $server['status'], + 'meta' => $server['meta'] ?? [], + 'created_at' => $server['created_at'] ?? now(), + 'updated_at' => $server['updated_at'] ?? now(), + 'module' => [ + 'id' => $module->id, + 'name' => $module->name, + ], + ]; + }, $json['servers'])); + + // broadcast(new Servers($servers)); + } + } else { + // if module return maintenance, then set module status to maintenance + $status = $response->status(); + if ($status == 503 || $status == 429 || $status == 502) { + $module->status = 'maintenance'; + } else { + $module->status = 'down'; + } + + Log::debug('模块状态更新为 ' . $module->status . ': ' . $module->name); + } + + $module->save(); + + // if local + if (config('app.env') === 'local') { + Cache::forever('module:' . $module->id . ':servers', $servers); + } else { + Cache::put('module:' . $module->id . ':servers', $servers, now()->addMinutes(10)); + } + } } } diff --git a/app/Jobs/Module/FetchModuleJob.php b/app/Jobs/Module/FetchModuleJob.php deleted file mode 100644 index 31c5040..0000000 --- a/app/Jobs/Module/FetchModuleJob.php +++ /dev/null @@ -1,104 +0,0 @@ -module = $module; - } - - /** - * Execute the job. - * - * @return void - */ - public function handle(): void - { - $module = $this->module; - - $servers = []; - - try { - $response = $module->http()->get('remote'); - } catch (Exception $e) { - Log::debug('无法连接到模块 - down: '.$e->getMessage()); - - // 如果模块状态不为 down,则更新为 down - if ($module->status !== 'down') { - $module->status = 'down'; - $module->save(); - } - - return; - } - - if ($response->successful()) { - // 如果模块状态不为 up,则更新为 up - if ($module->status !== 'up') { - $module->status = 'up'; - Log::debug('模块状态更新为 up: '.$module->name); - } - - $json = $response->json(); - - if (isset($json['servers']) && is_array($json['servers'])) { - // 只保留 name, status, meta - $servers = array_merge($servers, array_map(function ($server) use ($module) { - return [ - 'name' => $server['name'], - 'status' => $server['status'], - 'meta' => $server['meta'] ?? [], - 'created_at' => $server['created_at'] ?? now(), - 'updated_at' => $server['updated_at'] ?? now(), - 'module' => [ - 'id' => $module->id, - 'name' => $module->name, - ], - ]; - }, $json['servers'])); - - // broadcast(new Servers($servers)); - } - } else { - // if module return maintenance, then set module status to maintenance - $status = $response->status(); - if ($status == 503 || $status == 429 || $status == 502) { - $module->status = 'maintenance'; - } else { - $module->status = 'down'; - } - - Log::debug('模块状态更新为 '.$module->status.': '.$module->name); - } - - $module->save(); - - // if local - if (config('app.env') === 'local') { - Cache::forever('module:'.$module->id.':servers', $servers); - } else { - Cache::put('module:'.$module->id.':servers', $servers, now()->addMinutes(10)); - } - } -}