DataX的执行的入口方法是Engine::main方法,该方法中调用了Engine.entry(args)方法。
1 public static void entry(final String[] args) throws Throwable { 2 Options options = new Options(); 3 options.addOption("job", true, "Job config."); 4 options.addOption("jobid", true, "Job unique id."); 5 options.addOption("mode", true, "Job runtime mode."); 6 7 BasicParser parser = new BasicParser(); 8 CommandLine cl = parser.parse(options, args); 9 10 String jobPath = cl.getOptionValue("job"); 11 12 // 如果用户没有明确指定jobid, 则 datax.py 会指定 jobid 默认值为-1 13 String jobIdString = cl.getOptionValue("jobid"); 14 RUNTIME_MODE = cl.getOptionValue("mode"); 15 16 Configuration configuration = ConfigParser.parse(jobPath); 17 // 绑定i18n信息 18 MessageSource.init(configuration); 19 MessageSource.reloadResourceBundle(Configuration.class); 20 21 long jobId; 22 if (!"-1".equalsIgnoreCase(jobIdString)) { 23 jobId = Long.parseLong(jobIdString); 24 } else { 25 // only for dsc & ds & datax 3 update 26 String dscJobUrlPatternString = "/instance/(\\d{1,})/config.xml"; 27 String dsJobUrlPatternString = "/inner/job/(\\d{1,})/config"; 28 String dsTaskGroupUrlPatternString = "/inner/job/(\\d{1,})/taskGroup/"; 29 List<String> patternStringList = Arrays.asList(dscJobUrlPatternString, 30 dsJobUrlPatternString, dsTaskGroupUrlPatternString); 31 jobId = parseJobIdFromUrl(patternStringList, jobPath); // 如果jobPath满足了上面的正则,则取出jobId。否则,jobId就是-1。 32 } 33 34 boolean isStandAloneMode = "standalone".equalsIgnoreCase(RUNTIME_MODE); 35 if (!isStandAloneMode && jobId == -1) { 36 // 如果不是 standalone 模式,那么 jobId 一定不能为-1 37 throw DataXException.asDataXException(FrameworkErrorCode.CONFIG_ERROR, "非 standalone 模式必须在 URL 中提供有效的 jobId."); 38 } 39 configuration.set(CoreConstant.DATAX_CORE_CONTAINER_JOB_ID, jobId); 40 41 //打印vmInfo 42 VMInfo vmInfo = VMInfo.getVmInfo(); 43 if (vmInfo != null) { 44 LOG.info(vmInfo.toString()); 45 } 46 47 LOG.info("\n" + Engine.filterJobConfiguration(configuration) + "\n"); 48 49 LOG.debug(configuration.toJSON()); 50 51 ConfigurationValidate.doValidate(configuration); // 配置项检查。目前是空实现。 52 Engine engine = new Engine(); 53 engine.start(configuration); // 启动执行引擎。 54 }
从该方法中可以看到主体流程(忽略i18n的处理):
其中,解析命令行参数使用的是apache的Options、BasiParser与CommandLine三个类,仅少量代码,即完成了命令行参数解析:
Options options = new Options();
options.addOption("job", true, "Job config.");
options.addOption("jobid", true, "Job unique id.");
options.addOption("mode", true, "Job runtime mode.");
BasicParser parser = new BasicParser();
CommandLine cl = parser.parse(options, args);
后续使用具体参数时,使用以下方式获取:
String jobPath = cl.getOptionValue("job");
上面代码即可获取到命令行中的-job xxxx选项及参数。在自已编写代码时,也可以使用这种方式,获取命令行参数。
后续将对配置获取、启动引擎进行具体说明。jobId的解析,与作业类型有关,后续进一步研究后再进行说明。
标签:addOption,String,流程,jobId,job,源码,DataX,configuration,options From: https://www.cnblogs.com/xujq/p/16962527.html