繁体   English   中英

由企业调度程序运行时,Spring Batch CommandLineJobRunner挂起

[英]Spring Batch CommandLineJobRunner hangs when run by enterprise scheduler

我们的组织使用Skybot企业计划程序来运行批处理作业。 我们最近部署了我们的第一个spring批处理应用程序,并安排了使用CommandLineJobRunner作为主类运行的作业(Main-Class在jar的清单中定义)。 该命令如下所示:

java -Dspring.profiles.active=production -jar AppName.jar jobs/jobName.xml jobId

在命令行上手动执行时,作业可以完美运行。 当调度程序执行相同的命令时,该作业立即挂起,并且在skybot日志中没有任何输出,并且该作业没有完成任何工作。 我们调查了可能的权限问题,但不存在。 Spring批处理文档指出CommandLineJobRunner可用于从Shell运行计划的作业,但是我们的所有作业在执行后都会立即挂起。 我们该如何解决呢?

这似乎是CommandLineJobRunner类与Skybot之间的不兼容。 在决定用我自己的替换弹簧批处理类(加载应用程序上下文,构造JobLauncher等)之后,我查看了CommandLineJobRunner源代码 main方法有一个对System.in.available()的早期调用; 当我们通过键入命令并按Enter键运行作业时,标准输入可以从键盘读取换行符。 另一方面,作为stdin的Skybot不会立即阻止,但不会跟随换行,因此程序会无限等待输入。

从org.springframework.batch.core.launch.support.CommandLineJobRunner的主要方法中:

if (System.in.available() > 0) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String line = " ";
    while (line != null) {
        if (!line.startsWith("#") && StringUtils.hasText(line)) {
            if (logger.isDebugEnabled()) {
                logger.debug("Stdin arg: " + line);
            }
            newargs.add(line);
        }
        line = reader.readLine();
    }
}

我们的工作参数都是初始命令的参数,因此此代码是不必要且有问题的。 解决的办法是自己动手-与CommandLineJobRunner非常相似,但不与标准输入进行任何交互。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM