优化配置stop_on_error(调度执行发生错误是否终止执行)的判断方式

This commit is contained in:
azhengzz 2021-04-06 14:30:21 +08:00
parent b387a4466c
commit dbb04b70de
2 changed files with 9 additions and 10 deletions

View File

@ -75,12 +75,15 @@ class AbstractDispatcher(ABC):
session['project_id'] = project_id session['project_id'] = project_id
return return
# 下面是对参与调度的元素进行处理 # 下面是对参与调度的元素进行处理
stop_on_error = True # 调度执行发生错误时终止执行
if isinstance(element, Project): if isinstance(element, Project):
self.element_type = ELEMENT_TYPE.PROJECT self.element_type = ELEMENT_TYPE.PROJECT
project_id = element.id project_id = element.id
stop_on_error = element.project_advanced_configuration.stop_on_error
elif isinstance(element, Module): elif isinstance(element, Module):
self.element_type = ELEMENT_TYPE.MODULE self.element_type = ELEMENT_TYPE.MODULE
project_id = element.project.id project_id = element.project.id
stop_on_error = element.project.project_advanced_configuration.stop_on_error
elif isinstance(element, Scene): elif isinstance(element, Scene):
self.element_type = ELEMENT_TYPE.SCENE self.element_type = ELEMENT_TYPE.SCENE
project_id = element.module.project.id project_id = element.module.project.id
@ -109,6 +112,7 @@ class AbstractDispatcher(ABC):
self.dispatcher = Dispatcher.add(element_type=self.trigger_element_type, element_id=element.id) self.dispatcher = Dispatcher.add(element_type=self.trigger_element_type, element_id=element.id)
self.dispatcher.update_status(status=DISPATCHER_STATUS.RUNNING) self.dispatcher.update_status(status=DISPATCHER_STATUS.RUNNING)
self.dispatcher.end_type = DISPATCHER_END_TYPE.SUCCESS # 标识调度终止类型 self.dispatcher.end_type = DISPATCHER_END_TYPE.SUCCESS # 标识调度终止类型
self.dispatcher.stop_on_error = stop_on_error # 调度执行发生错误时终止执行
# 实例化调度日志dispatcher_logger # 实例化调度日志dispatcher_logger
self.dispatcher_logger = DispatcherLogger(use_memory_string_handler=True, self.dispatcher_logger = DispatcherLogger(use_memory_string_handler=True,
use_dispatcher_log_db_handler=True, use_dispatcher_log_db_handler=True,
@ -119,6 +123,7 @@ class AbstractDispatcher(ABC):
emit_dispatcher_start(id=self.dispatcher.id, type=self.trigger_element_type, report_id=report.id) emit_dispatcher_start(id=self.dispatcher.id, type=self.trigger_element_type, report_id=report.id)
# 调度预处理 # 调度预处理
self._dispatcher_set_up() self._dispatcher_set_up()
# 创建一条调度子数据 # 创建一条调度子数据
if self.element_type in [ELEMENT_TYPE.PROJECT, ELEMENT_TYPE.MODULE, ELEMENT_TYPE.SCENE]: if self.element_type in [ELEMENT_TYPE.PROJECT, ELEMENT_TYPE.MODULE, ELEMENT_TYPE.SCENE]:
# 元素类型为Project、Module、Scene时会在构造函数中直接创建调度子数据。而元素类型Case/Tool/LogicController是在Scene.execute()方法中创建 # 元素类型为Project、Module、Scene时会在构造函数中直接创建调度子数据。而元素类型Case/Tool/LogicController是在Scene.execute()方法中创建
@ -191,7 +196,7 @@ class AbstractDispatcher(ABC):
else: else:
self.dispatcher_logger.logger.error('执行异常: %s' % e) self.dispatcher_logger.logger.error('执行异常: %s' % e)
self.dispatcher_logger.logger.error(traceback.format_exc()) self.dispatcher_logger.logger.error(traceback.format_exc())
if self.dispatcher_type != DISPATCHER_TYPE.DEBUG: if self.dispatcher_type != DISPATCHER_TYPE.DEBUG and self.dispatcher.stop_on_error:
self.dispatcher.update_status(status=DISPATCHER_STATUS.STOPPED) self.dispatcher.update_status(status=DISPATCHER_STATUS.STOPPED)
self.dispatcher.end_type = DISPATCHER_END_TYPE.ERROR # 标识调度终止类型 self.dispatcher.end_type = DISPATCHER_END_TYPE.ERROR # 标识调度终止类型
raise e raise e
@ -652,9 +657,6 @@ class SceneDispatcher(AbstractSceneDispatcher):
# 场景组件 # 场景组件
self.scene = scene self.scene = scene
# 是否发生异常时终止执行
self.stop_on_error = self.scene.module.project.project_advanced_configuration.stop_on_error
# 标识组件执行结果 # 标识组件执行结果
self.element_execute_result = '' self.element_execute_result = ''
@ -677,14 +679,10 @@ class SceneDispatcher(AbstractSceneDispatcher):
else: else:
self.element_execute_result = REPORT_RESULT.ERROR self.element_execute_result = REPORT_RESULT.ERROR
# 如果配置了执行错误时不终止,则不向上抛出异常 # 如果配置了执行错误时不终止,则不向上抛出异常
if self.stop_on_error: if self.dispatcher.stop_on_error:
raise e raise e
else: else:
# 在dispatcher.run()中发生异常会将其置为ABORT因此这里需要重置为SUCCESS pass
# 表示当组件发生错误但继续执行时调度结束类型不更新初始就是SUCCESS
self.dispatcher.end_type = DISPATCHER_END_TYPE.SUCCESS
# 和上面同理当继续执行时重置调度状态为RUNNING初始就是RUNNING
self.dispatcher.update_status(status=DISPATCHER_STATUS.RUNNING)
else: else:
pass pass
finally: finally:

View File

@ -3074,6 +3074,7 @@ class Dispatcher(db.Model):
report = db.relationship('Report', uselist=False, back_populates='dispatcher', cascade='all') report = db.relationship('Report', uselist=False, back_populates='dispatcher', cascade='all')
end_type = '' # 调度结束类型 DISPATCHER_END_TYPE, 暂时不需要将其作为表字段使用,而是作为实例属性使用便于在调度过程中标识 end_type = '' # 调度结束类型 DISPATCHER_END_TYPE, 暂时不需要将其作为表字段使用,而是作为实例属性使用便于在调度过程中标识
stop_on_error = True # 调度执行发生错误时终止执行与项目配置ProjectAdvancedConfiguration.stop_on_error一致
@classmethod @classmethod
def add(cls, element_type, element_id): def add(cls, element_type, element_id):