作者 赵彬吉

update

@@ -28,18 +28,10 @@ class SyncSubmitTask extends Command @@ -28,18 +28,10 @@ class SyncSubmitTask extends Command
28 28
29 public function handle() 29 public function handle()
30 { 30 {
31 - $backup = false;  
32 while (true) { 31 while (true) {
33 - $task_id = $this->getTaskId();  
34 - if ($task_id > 2000000) {  
35 - $backup = true;  
36 - }  
37 - if (empty($task_id)) {  
38 - if ($backup) {  
39 - $this->backup();  
40 - $backup = false;  
41 - }  
42 - sleep(5); 32 + $task_id = Redis::rpop('sync_submit_task');
  33 + if(!$task_id){
  34 + sleep(3);
43 continue; 35 continue;
44 } 36 }
45 $this->output('任务' . $task_id . '开始'); 37 $this->output('任务' . $task_id . '开始');
@@ -79,31 +71,6 @@ class SyncSubmitTask extends Command @@ -79,31 +71,6 @@ class SyncSubmitTask extends Command
79 } 71 }
80 } 72 }
81 73
82 - public function getTaskId()  
83 - {  
84 - $task_id = Redis::rpop('sync_submit_task');  
85 - $lockKey = 'lock_sync_submit_task';  
86 - if (empty($task_id)) {  
87 - // 获取锁  
88 - if (Redis::setnx($lockKey, 1)) {  
89 - // 设置锁的过期时间,防止死锁  
90 - Redis::expire($lockKey, 10);  
91 - $tasks = SyncSubmitTaskModel::where('status', 0)->limit(100)->get();  
92 - foreach ($tasks as $task) {  
93 - $task->status = 2;  
94 - $task->save();  
95 - Redis::lpush('sync_submit_task', $task->id);  
96 - }  
97 - $task_id = Redis::rpop('sync_submit_task');  
98 - Redis::del($lockKey);  
99 - } else {  
100 - // 未获取到锁  
101 - return '';  
102 - }  
103 - }  
104 - return $task_id;  
105 - }  
106 -  
107 /** 74 /**
108 * 输出处理日志 75 * 输出处理日志
109 */ 76 */
@@ -112,31 +79,4 @@ class SyncSubmitTask extends Command @@ -112,31 +79,4 @@ class SyncSubmitTask extends Command
112 echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL; 79 echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
113 return true; 80 return true;
114 } 81 }
115 -  
116 - /**  
117 - * 备份数据  
118 - * @author zbj  
119 - * @date 2024/1/23  
120 - */  
121 - public function backup()  
122 - {  
123 - DB::beginTransaction();  
124 - try {  
125 - $table = (new SyncSubmitTaskModel())->getTable();  
126 - $new_table = $table . '_backup_' . date('Ymd');  
127 -  
128 - //重命名当前表  
129 - Schema::rename($table, $new_table);  
130 - //克隆表数据  
131 - DB::statement('CREATE TABLE ' . $table . ' LIKE ' . $new_table);  
132 -  
133 - DB::commit();  
134 -  
135 - $this->output('数据备份成功');  
136 - } catch (\Exception $e) {  
137 - $this->output('数据备份失败' . $e->getMessage());  
138 - DB::rollBack();  
139 - }  
140 - return true;  
141 - }  
142 } 82 }
  1 +<?php
  2 +
  3 +namespace App\Console\Commands\Sync;
  4 +
  5 +
  6 +use App\Exceptions\InquiryFilterException;
  7 +use App\Models\Project\Project;
  8 +use App\Models\SyncSubmitTask\SyncSubmitTask as SyncSubmitTaskModel;
  9 +use App\Services\SyncSubmitTaskService;
  10 +use Illuminate\Console\Command;
  11 +use Illuminate\Support\Facades\Cache;
  12 +use Illuminate\Support\Facades\DB;
  13 +use Illuminate\Support\Facades\Redis;
  14 +use Illuminate\Support\Facades\Schema;
  15 +use Illuminate\Support\Str;
  16 +
  17 +/**
  18 + *
  19 + * Class SyncSubmitTask
  20 + * @package App\Console\Commands
  21 + * @author zbj
  22 + * @date 2023/11/28
  23 + */
  24 +class SyncSubmitTaskDistribution extends Command
  25 +{
  26 +
  27 + protected $signature = 'sync_submit_task_distribution';
  28 + protected $description = '询盘、访问异步任务分发';
  29 +
  30 + public function handle()
  31 + {
  32 + while (true) {
  33 + $len = Redis::llen('sync_submit_task');
  34 + if (!$len) {
  35 + $max_id = SyncSubmitTaskModel::orderBy('id', 'desc')->value('id');
  36 + if ($max_id > 2000000) {
  37 + $this->backup();
  38 + } else {
  39 + $tasks = SyncSubmitTaskModel::where('status', 0)->limit(100)->get();
  40 + foreach ($tasks as $task) {
  41 + $task->status = 2;
  42 + $task->save();
  43 + Redis::lpush('sync_submit_task', $task->id);
  44 + }
  45 + }
  46 + }
  47 + sleep(3);
  48 + }
  49 + }
  50 +
  51 + /**
  52 + * 输出处理日志
  53 + */
  54 + public function output($message): bool
  55 + {
  56 + echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
  57 + return true;
  58 + }
  59 +
  60 + /**
  61 + * 备份数据
  62 + * @author zbj
  63 + * @date 2024/1/23
  64 + */
  65 + public function backup()
  66 + {
  67 + DB::beginTransaction();
  68 + try {
  69 + $table = (new SyncSubmitTaskModel())->getTable();
  70 + $new_table = $table . '_backup_' . date('Ymd');
  71 +
  72 + //重命名当前表
  73 + Schema::rename($table, $new_table);
  74 + //克隆表数据
  75 + DB::statement('CREATE TABLE ' . $table . ' LIKE ' . $new_table);
  76 +
  77 + //未入队的写到新表
  78 + $list = DB::table($new_table)->where('status', 0)->get();
  79 + $data = [];
  80 + foreach ($list as $task) {
  81 + $data[] = [
  82 + 'type' => $task->type,
  83 + 'data' => json_encode($task->data),
  84 + 'created_at' => $task['created_at'],
  85 + 'updated_at' => $task['updated_at'],
  86 + ];
  87 + }
  88 + $data && SyncSubmitTaskModel::insert($data);
  89 +
  90 + DB::commit();
  91 +
  92 + $this->output('数据备份成功');
  93 + } catch (\Exception $e) {
  94 + $this->output('数据备份失败' . $e->getMessage());
  95 + DB::rollBack();
  96 + }
  97 + return $new_table ?? '';
  98 + }
  99 +}