def execute_call_back(workflow_id, instance_name, url): workflow_detail = SqlWorkflow.objects.get(id=workflow_id) try: # 交给inception先split,再执行 (finalStatus, finalList) = InceptionDao(instance_name=instance_name).executeFinal(workflow_detail) # 封装成JSON格式存进数据库字段里 str_json_result = json.dumps(finalList) workflow_detail = SqlWorkflow.objects.get(id=workflow_id) workflow_detail.execute_result = str_json_result workflow_detail.finish_time = timezone.now() workflow_detail.status = finalStatus workflow_detail.is_manual = 0 workflow_detail.audit_remark = '' # 关闭后重新获取连接,防止超时 connection.close() workflow_detail.save() except Exception: logger.error(traceback.format_exc()) # 增加工单日志 # 获取audit_id audit_id = Workflow.audit_info_by_workflow_id(workflow_id=workflow_id, workflow_type=WorkflowDict.workflow_type['sqlreview']).audit_id Workflow.add_workflow_log(audit_id=audit_id, operation_type=6, operation_type_desc='执行结束', operation_info='执行结果:{}'.format(workflow_detail.status), operator='', operator_display='系统' ) # 发送消息 send_msg(workflow_detail, url)
def execute_job(workflow_id, url): job_id = Const.workflowJobprefix['sqlreview'] + '-' + str(workflow_id) logger.debug('execute_job:' + job_id + ' start') workflow_detail = SqlWorkflow.objects.get(id=workflow_id) instance_name = workflow_detail.instance_name db_name = workflow_detail.db_name # 服务器端二次验证,当前工单状态必须为定时执行过状态 if workflow_detail.status != Const.workflowStatus['timingtask']: raise Exception('工单不是定时执行状态') # 将流程状态修改为执行中,并更新reviewok_time字段 workflow_detail.status = Const.workflowStatus['executing'] workflow_detail.reviewok_time = timezone.now() try: workflow_detail.save() except Exception: # 关闭后重新获取连接,防止超时 connection.close() workflow_detail.save() logger.debug('execute_job:' + job_id + ' executing') # 执行之前重新split并check一遍,更新SHA1缓存;因为如果在执行中,其他进程去做这一步操作的话,会导致inception core dump挂掉 split_review_result = InceptionDao( instance_name=instance_name).sqlautoReview(workflow_detail.sql_content, db_name, isSplit='yes') workflow_detail.review_content = json.dumps(split_review_result) try: workflow_detail.save() except Exception: # 关闭后重新获取连接,防止超时 connection.close() workflow_detail.save() # 采取异步回调的方式执行语句,防止出现持续执行中的异常 t = Thread(target=execute_call_back, args=(workflow_id, instance_name, url)) t.start() # 增加工单日志 # 获取audit_id audit_id = Workflow.audit_info_by_workflow_id( workflow_id=workflow_id, workflow_type=WorkflowDict.workflow_type['sqlreview']).audit_id Workflow.add_workflow_log(audit_id=audit_id, operation_type=5, operation_type_desc='执行工单', operation_info='系统定时执行', operator='', operator_display='系统')
def execute_skipinc_call_back(workflowId, instance_name, db_name, sql_content, url): workflowDetail = SqlWorkflow.objects.get(id=workflowId) try: # 执行sql t_start = time.time() execute_result = Dao(instance_name=instance_name).mysql_execute( db_name, sql_content) t_end = time.time() execute_time = "%5s" % "{:.4f}".format(t_end - t_start) execute_result['execute_time'] = execute_time + 'sec' workflowDetail = SqlWorkflow.objects.get(id=workflowId) if execute_result.get('Warning'): workflowDetail.status = Const.workflowStatus['exception'] elif execute_result.get('Error'): workflowDetail.status = Const.workflowStatus['exception'] else: workflowDetail.status = Const.workflowStatus['finish'] workflowDetail.finish_time = timezone.now() workflowDetail.execute_result = json.dumps(execute_result) workflowDetail.is_manual = 1 workflowDetail.audit_remark = '' workflowDetail.is_backup = '否' # 关闭后重新获取连接,防止超时 connection.close() workflowDetail.save() except Exception: logger.error(traceback.format_exc()) # 增加工单日志 # 获取audit_id audit_id = Workflow.auditinfobyworkflow_id( workflow_id=workflowId, workflow_type=WorkflowDict.workflow_type['sqlreview']).audit_id Workflow.add_workflow_log(audit_id=audit_id, operation_type=6, operation_type_desc='执行结束', operation_info='执行结果:{}'.format( workflowDetail.status), operator='', operator_display='系统') # 发送消息 send_msg(workflowDetail, url)
def execute_callback(task): """异步任务的回调, 将结果填入数据库等等 使用django-q的hook, 传入参数为整个task task.result 是真正的结果 """ workflow_id = task.args[0] workflow = SqlWorkflow.objects.get(id=workflow_id) workflow.finish_time = task.stopped if not task.success: # 不成功会返回字符串 workflow.status = Const.workflowStatus['exception'] elif task.result.warning or task.result.error: workflow.status = Const.workflowStatus['exception'] execute_result = task.result else: workflow.status = Const.workflowStatus['finish'] execute_result = task.result workflow.execute_result = execute_result.json() workflow.audit_remark = '' workflow.save() # 增加工单日志 # 获取audit_id audit_id = Workflow.audit_info_by_workflow_id(workflow_id=workflow_id, workflow_type=WorkflowDict.workflow_type['sqlreview']).audit_id Workflow.add_workflow_log(audit_id=audit_id, operation_type=6, operation_type_desc='执行结束', operation_info='执行结果:{}'.format(workflow.status), operator='', operator_display='系统' ) # 发送消息 send_msg(workflow)