【问题标题】:Spring Batch CommandLineJobRunner hangs when run by enterprise schedulerSpring Batch CommandLineJobRunner 在由企业调度程序运行时挂起
【发布时间】:2016-04-20 16:22:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-batch scheduler


    【解决方案1】:

    这似乎是 CommandLineJobRunner 类和 Skybot 之间的不兼容。在决定用我自己的替换spring批处理类(加载应用程序上下文,构造一个JobLauncher等)后,我查看了source code for CommandLineJobRunner。 main方法有提前调用System.in.available();当我们通过键入命令并按回车来运行作业时,标准输入可以从键盘读取换行符。另一方面,作为标准输入的 Skybot 不会立即阻塞,但不会出现换行,因此程序会无休止地等待输入。

    来自org.springframework.batch.core.launch.support.CommandLineJobRunner的main方法:

    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 非常相似,但不与标准输入进行任何交互。

    【讨论】:

    • @MichaelMinella,谢谢 - 我需要调查一下。
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2020-02-17
    • 2017-04-20
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多