#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2023/5/21 16:49 # @Author : old tom # @File : metadata_compare_task.py # @Project : futool-tiny-datahub # @Desc : 版本比较任务管理 from common.futool.core.fu_lang import str_md5 from datahub.local_db_conf import local_conn from datahub.log_conf import log from dataclasses import dataclass from datahub.metadata.metaversion.versiondao.metadata_task_dao import MetaTaskDao @dataclass class MetadataCompareTask(object): # 版本号1 version_code_1: int # 版本号2 version_code_2: int # 版本号1对应的数据源ID source_id_1: str # 版本号2对应的数据源ID source_id_2: str = None # 比较任务类型 compare_task_type: str = 'same' if source_id_2 is None else 'diff' def compare_id_gen(self) -> str: """ 生成任务ID :return: """ return str_md5(''.join([str(getattr(self, x)) for x in self.__dict__.keys()])) class MetadataCompareTaskManage(object): class MetadataCompareTaskError(Exception): """ 自定义异常 """ def __init__(self, msg=''): Exception.__init__(self, msg) """ 版本比较任务管理 """ def __init__(self): self.dao = MetaTaskDao(local_conn) def create_task(self, task: MetadataCompareTask) -> bool: """ 创建任务 :return: """ compare_id = task.compare_id_gen() self._check_task_exist(compare_id) return self.dao.create_task(compare_id, task.version_code_1, task.version_code_2, task.source_id_1, task.source_id_2, task.compare_task_type) def finish_task(self, compare_id): """ 结束任务 :return: """ self._check_task_not_exist(compare_id) return self.dao.finish_task(compare_id) def has_finished(self, compare_id): """ 判断任务是否结束 :param compare_id: :return: """ self._check_task_not_exist(compare_id) return self.dao.check_task_status(compare_id) def _check_task_exist(self, compare_id): """ 校验任务是否存在 :param compare_id: :return: """ if self.dao.task_exists(compare_id): log.error(f'版本比较任务已存在,任务ID={compare_id}') raise self.MetadataCompareTaskError() def _check_task_not_exist(self, compare_id): """ 校验任务是否不存在 :param compare_id: :return: """ if not self.dao.task_exists(compare_id): log.error(f'版本比较任务不存在,请先创建任务') raise self.MetadataCompareTaskError()