示例#1
0
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)
示例#2
0
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='系统')
示例#3
0
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)
示例#4
0
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)