首先,触发按钮
web
会弹出一个页面ajax
能够看到有个exec id 1app
为何会发生这一切? 经过抓包,咱们得知webapp
因此须要研究 ide
stop in azkaban.webapp.servlet.ExecutorServlet.doGetui
stop in azkaban.webapp.servlet.ExecutorServlet.ajaxAttemptExecuteFlowspa
stop in azkaban.webapp.servlet.ExecutorServlet.ajaxExecuteFlowserver
stop in azkaban.server.HttpRequestUtils.parseFlowOptionsip
runrem
======================================================================
首先,系统确定会本身构造一些默认的参数,可是看到上面这个截图,咱们知道,咱们是能够覆盖的
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());