Azkaban的Web Server源码探究系列22: 一次性执行execute的提交准备

首先,触发按钮

111400_Zkha_1382024.png

会弹出一个页面

111414_zhxC_1382024.png

可以看到有个exec id 1

为什么会发生这一切?  通过抓包,我们得知

111723_YaCL_1382024.png

所以需要研究 

stop in azkaban.webapp.servlet.ExecutorServlet.doGet

stop in azkaban.webapp.servlet.ExecutorServlet.ajaxAttemptExecuteFlow

stop in azkaban.webapp.servlet.ExecutorServlet.ajaxExecuteFlow

stop in azkaban.server.HttpRequestUtils.parseFlowOptions

run

======================================================================

首先,系统肯定会自己构造一些默认的参数,但是看到上面这个截图,我们知道,我们是可以覆盖的

ExecutionOptions options = HttpRequestUtils.parseFlowOptions(req);

看到了吧,就是解析http请求中的一些参数,然后覆盖过去

下面看看哪些参数可以解析出!

------------------------------------------------------

1)failureAction

if (hasParam(req, "failureAction")) {

      String option = getParam(req, "failureAction");

      if (option.equals("finishCurrent")) {

        execOptions.setFailureAction(FailureAction.FINISH_CURRENTLY_RUNNING);

      } else if (option.equals("cancelImmediately")) {

        execOptions.setFailureAction(FailureAction.CANCEL_ALL);

      } else if (option.equals("finishPossible")) {

        execOptions.setFailureAction(FailureAction.FINISH_ALL_POSSIBLE);

      }

    }

  public enum FailureAction {

    FINISH_CURRENTLY_RUNNING, CANCEL_ALL, FINISH_ALL_POSSIBLE

  }

可以看到,这个是获取失败时的行为,有三种:1)结束当前运行的节点 2)取消所有  3)结束所有可能的

当然具体到底啥意思,要等执行者的代码看懂了才知道!

---

2)failureEmailsOverride

if (hasParam(req, "failureEmailsOverride")) {

      boolean override = getBooleanParam(req, "failureEmailsOverride", false);

      execOptions.setFailureEmailsOverridden(override);

    }

---

3)successEmailsOverride

if (hasParam(req, "successEmailsOverride")) {

      boolean override = getBooleanParam(req, "successEmailsOverride", false);

      execOptions.setSuccessEmailsOverridden(override);

    }

---

4)failureEmails

 if (hasParam(req, "failureEmails")) {

      String emails = getParam(req, "failureEmails");

      if (!emails.isEmpty()) {

        String[] emailSplit = emails.split("\\s*,\\s*|\\s*;\\s*|\\s+");

        execOptions.setFailureEmails(Arrays.asList(emailSplit));

      }

    }

---

5)successEmails

if (hasParam(req, "successEmails")) {

      String emails = getParam(req, "successEmails");

      if (!emails.isEmpty()) {

        String[] emailSplit = emails.split("\\s*,\\s*|\\s*;\\s*|\\s+");

        execOptions.setSuccessEmails(Arrays.asList(emailSplit));

      }

    }

---

6)notifyFailureFirst

if (hasParam(req, "notifyFailureFirst")) {

      execOptions.setNotifyOnFirstFailure(Boolean.parseBoolean(getParam(req,

          "notifyFailureFirst")));

    }

7)notifyFailureLast

    if (hasParam(req, "notifyFailureLast")) {

      execOptions.setNotifyOnLastFailure(Boolean.parseBoolean(getParam(req,

          "notifyFailureLast")));


    }

===

8)

String concurrentOption = "skip";

    if (hasParam(req, "concurrentOption")) {

      concurrentOption = getParam(req, "concurrentOption");

      execOptions.setConcurrentOption(concurrentOption);

      if (concurrentOption.equals("pipeline")) {

        int pipelineLevel = getIntParam(req, "pipelineLevel");

        execOptions.setPipelineLevel(pipelineLevel);

      } else if (concurrentOption.equals("queue")) {

        // Not yet implemented

        int queueLevel = getIntParam(req, "queueLevel", 1);

        execOptions.setPipelineLevel(queueLevel);

      }

    }

---

 String mailCreator = DefaultMailCreator.DEFAULT_MAIL_CREATOR;

    if (hasParam(req, "mailCreator")) {

      mailCreator = getParam(req, "mailCreator");

      execOptions.setMailCreator(mailCreator);//邮件发送者

    }

===

Map<String, String> flowParamGroup = getParamGroup(req, "flowOverride");

    execOptions.addAllFlowParameters(flowParamGroup);

这个应该比较重要!

===最后一个就是可以取消job

if (hasParam(req, "disabled")) {

      String disabled = getParam(req, "disabled");

      if (!disabled.isEmpty()) {

        @SuppressWarnings("unchecked")

        List<Object> disabledList =

            (List<Object>) JSONUtils.parseJSONFromStringQuiet(disabled);

        execOptions.setDisabledJobs(disabledList);

      }

    }

===

ExecutionOptions options = HttpRequestUtils.parseFlowOptions(req);

  //优先采用从HTTP中解析出来的options

    exflow.setExecutionOptions(options);

  //如果可以覆盖,则从job中覆盖

    if (!options.isFailureEmailsOverridden()) {

      options.setFailureEmails(flow.getFailureEmails());

    }

  //如果可以覆盖,则从job中覆盖

    if (!options.isSuccessEmailsOverridden()) {

      options.setSuccessEmails(flow.getSuccessEmails());

    }

  //强制直接从flow中覆盖

    options.setMailCreator(flow.getMailCreator());

==============================================================

/**

   * <pre>

   * Remove following flow param if submitting user is not an Azkaban admin

   * FLOW_PRIORITY

   * USE_EXECUTOR

   * @param userManager

   * @param options

   * @param user

   * </pre>

   */

  public static void filterAdminOnlyFlowParams(UserManager userManager,

    ExecutionOptions options, User user)  throws ExecutorManagerException {

//校验合法性

    if (options == null || options.getFlowParameters() == null)

      return;

  //获取参数

    Map<String, String> params = options.getFlowParameters();

    // is azkaban Admin

    //

    if (!hasPermission(userManager, user, Type.ADMIN)) {//不是ADMIN还敢指派ADMIN命令???想逆天啊?

      params.remove(ExecutionOptions.FLOW_PRIORITY);

      params.remove(ExecutionOptions.USE_EXECUTOR);

    } else {//否则的话,如果参数有必须为数字类型

      validateIntegerParam(params, ExecutionOptions.FLOW_PRIORITY);

      validateIntegerParam(params, ExecutionOptions.USE_EXECUTOR);

    }

  }


万事俱备,开始提交

String message =  executorManager.submitExecutableFlow(exflow, user.getUserId());


转载于:https://my.oschina.net/qiangzigege/blog/656089

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值