def init_exec_status(self): # 初始化缓存的任务信息 task_info = { 'task_id': self._task_id, 'start_time': SysUtils.get_now_time_str(), 'task_status': TaskStatus.RUNNING, 'percentage': 0.0, 'progress_history': [], 'result': {} } task_info = dict(task_info, **self._extra_info) # 缓存该任务信息 MyRedis.set(self._task_id, task_info, category=task_cat) # 在数据库中保存任务记录 TasksDAO.save(task_info) # 保存任务详情日志 LogRecords.save(task_info, category='task', action='任务启动', desc='记录任务启动时状态及任务信息') # 返回该任务信息 return task_info
def save_exec_info_pack_id(task_id, pack_id=None): # 从缓存或数据库中读取该任务的记录 task_info = MyTask.fetch_exec_info(task_id) # 没有该任务信息记录时,返回失败 if task_info is None: return False if pack_id is not None: task_info['pack_id'] = pack_id TasksDAO.save(task_info)
def save_exec_info_name(task_id, process_file_name=None): # 从缓存或数据库中读取该任务的记录 task_info = MyTask.fetch_exec_info(task_id) # 没有该任务信息记录时,返回失败 if task_info is None: return False # 增加当前任务处理的文件名(考虑任务出发点是文件) if process_file_name is not None: task_info['process_file_name'] = process_file_name TasksDAO.save(task_info)
def stop_running_tasks_of_pack(pack_id): tasks_list = TasksDAO.search_by_pack(pack_id) for task_info in tasks_list: task_status = task_info['task_status'] # 没有执行完成的任务状态,用缓存中任务信息代替 if task_status == TaskStatus.START or task_status == TaskStatus.RUNNING: MyTask.stop_task(task_info['task_id'])
def save_exec_info(task_id, percent, result=None, notify=True): # 从缓存或数据库中读取该任务的记录 task_info = MyTask.fetch_exec_info(task_id) # 没有该任务信息记录时,返回失败 if task_info is None: return False # 设置百分比和运行状态 task_info['percentage'] = percent # 结果集不为空时,用新的结果集替换 if result is not None: task_info['result'] = result # 计算并记录执行时间(预计剩余时间) task_info['remain_time'] = MyTask._calc_exec_time(task_info) # 设置当前记录时间 task_info['record_time'] = SysUtils.get_now_time_str() # 保存处理进程的历史记录 MyTask._save_progress_history(task_info) # 调用 websocket task_feedback task_feedback(task_id, task_info) # 运行100%时,设置任务完成状态,并更新数据库,清理缓存 if percent == 100.0: task_info['task_status'] = TaskStatus.COMPLETE TasksDAO.save(task_info) MyRedis.delete(task_id, category=task_cat) # 保存任务详情日志 LogRecords.save(task_info, category='task', action='任务完成', desc='任务执行100%,记录任务执行结果信息') else: # 缓存该任务的记录 MyRedis.set(task_id, task_info, category=task_cat) # 发送执行状态的更新消息 if notify: MyTask.notify_task_exec_info(task_info) return True
def query_component(request): # path('task/query_component', task_view.query_component, name='task_query_component'), # 读取数据库任务集合 task_id_list = TasksDAO.all_component() # 保存操作日志 LogRecords.save(task_id_list, category='query', action='查询组件任务状态') return sys_app_ok_p(task_id_list)
def search_tasks_by_file(request): # 从请求中取参数:文件 ID file_id = req_get_param(request, 'file_id') if file_id is None: return sys_app_ok_p([]) tasks_list = TasksDAO.search_by_file(file_id) # 保存查询日志 LogRecords.save(tasks_list, category='query_task', action='查询文件任务', desc='查询指定的文件(ID=%s)所有的任务信息' % file_id) return sys_app_ok_p(tasks_list)
def stop_task(task_id): # 从缓存中取出任务信息,同时删除这条缓存 task_info = MyTask.fetch_exec_info(task_id, remove=True) # 只允许终止正在运行的任务 if task_info['task_status'] != TaskStatus.RUNNING: return task_info # 设置停止状态和 stop_time task_info['task_status'] = TaskStatus.STOPPED task_info['stop_time'] = SysUtils.get_now_time_str() # 在数据库中保存任务信息 TasksDAO.save(task_info) # 保存任务详情日志 LogRecords.save(task_info, category='task', action='任务终止', desc='任务被终止') return task_info
def fetch_exec_info(task_id, remove=False): # 从缓存中读取该任务的记录 task_info = MyRedis.get(task_id, category=task_cat) # 如设置移除参数,删除该记录 if remove and task_info is not None: MyRedis.delete(task_id, category=task_cat) # 缓存中没有任务信息,则从数据库中读取 if task_info is None: task_info = TasksDAO.find(task_id) return task_info
def get_all_task_result(request): # 读取数据库任务集合 task_id_list = TasksDAO.all_tasks() # task_info_list = [] # # 从缓存中读取任务执行信息 # for task in task_id_list: # print(task['task_id']) # task_info = MyTask.fetch_exec_info(task['task_id']) # task_id_list.append(task_info) # 保存操作日志 LogRecords.save(task_id_list, category='query', action='查询全部任务状态') return sys_app_ok_p(task_id_list)
def search_tasks_by_pack(request): # 从请求中取参数:包 ID pack_id = req_get_param(request, 'pack_id') if pack_id is None: return sys_app_ok_p([]) tasks_list = TasksDAO.search_by_pack(pack_id) task_info_list = [] for task_info in tasks_list: # 没有执行完成的任务状态,用缓存中任务信息代替 if task_info['task_status'] != TaskStatus.COMPLETE: task_info = MyTask.fetch_exec_info(task_info['task_id']) task_info_list.append(task_info) # 保存查询日志 LogRecords.save(task_info_list, category='query_task', action='查询固件包任务', desc='查询指定的固件包(ID=%s)所有的任务信息' % pack_id) return sys_app_ok_p(task_info_list)