【问题标题】:System.exit(1) from Spring batch来自 Spring 批处理的 System.exit(1)
【发布时间】:2016-08-21 12:04:50
【问题描述】:

我正在尝试通过退出状态提示调用者是否成功。

SpringApplication app = new SpringApplication(Foo.class);
app.setWebEnvironment(false);
ConfigurableApplicationContext ctx= app.run(args);
SimpleJobLauncher jobLauncher = ctx.getBean(SimpleJobLauncher.class);
Job job = ctx.getBean("Foo", Job.class);
JobParameters jobParameters = new JobParametersBuilder().toJobParameters();
try {
      //test
      JobExecution jobExec = jobLauncher.run(job, jobParameters);
      if(ExitStatus.FAILED.equals(jobExec.getExitStatus())){
            System.exit(1);
}catch(JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
                | JobParametersInvalidException e) {
            logger.error("Exception in Foo"+e,e);
            System.exit(-1);
        }

但是程序没有将值返回给调用者。我正在从 Unix 脚本调用程序,并且 Unix 进程一直在运行。

【问题讨论】:

  • jobLauncher.run(job, jobParameters);立即返回给调用者,因此作业仍在运行,您需要等待完成执行
  • 是的,我编码的方式是等待工作完成。但这里的问题是 System.exit(1);没有将控制器返回给调用者。该进程在 Unix 中继续运行。
  • 你调试了吗?条件不满足(exitStatus=FAILED),因此 System.exit(-1) 将不起作用,您至少需要一个 else 分支来对其他状态条件作出反应
  • 如果出现异常,我将退出。我正在 catch 块中编写退出语句。
  • 似乎进程没有抛出异常并且没有失败,这意味着作业正在运行..您需要查看记录器,读取器/处理器/写入器是否正在运行...或者您可以自定义阅读器/处理器/编写器进行调试。

标签: java spring spring-batch


【解决方案1】:

我宁愿通过CommandLineJobRunner 启动您的工作,而不是通过命令行启动您的工作的自定义代码。它会为您处理System.exit()

GrepCode link如果你想看看他们是怎么做到的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2018-11-15
    相关资源
    最近更新 更多