Spring 企业调度程序在 运行 时批处理 CommandLineJobRunner 挂起
Spring Batch CommandLineJobRunner hangs when run by enterprise scheduler
我们的组织使用 Skybot 企业调度程序来 运行 批处理作业。我们最近部署了我们的第一个 spring 批处理应用程序,并将我们的作业安排到 运行 使用 CommandLineJobRunner
作为主要 class(Main-Class 在清单中定义我们的罐子)。命令如下所示:
java -Dspring.profiles.active=production -jar AppName.jar jobs/jobName.xml jobId
在命令行上手动执行时,作业 运行 完美。当调度程序执行相同的命令时,作业立即挂起,skybot 日志中没有任何输出,作业也没有完成任何工作。我们调查了可能存在的权限问题,但存在 none。 spring 批处理文档指出 CommandLineJobRunner
可用于从 shell 中执行 运行 计划作业,但我们所有的作业都在执行后立即挂起。我们如何解决这个问题?
这似乎是 CommandLineJobRunner class 和 Skybot 之间的不兼容性。在决定用我自己的批处理 spring 替换 class 之后(加载应用程序上下文、构建 JobLauncher 等),我查看了 source code for CommandLineJobRunner。 main 方法提前调用了 System.in.available()
;当我们 运行 通过键入命令并按回车键来工作时,标准输入可以从键盘读取换行符。另一方面,作为标准输入的 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 非常相似,但不与标准输入进行任何交互。
我们的组织使用 Skybot 企业调度程序来 运行 批处理作业。我们最近部署了我们的第一个 spring 批处理应用程序,并将我们的作业安排到 运行 使用 CommandLineJobRunner
作为主要 class(Main-Class 在清单中定义我们的罐子)。命令如下所示:
java -Dspring.profiles.active=production -jar AppName.jar jobs/jobName.xml jobId
在命令行上手动执行时,作业 运行 完美。当调度程序执行相同的命令时,作业立即挂起,skybot 日志中没有任何输出,作业也没有完成任何工作。我们调查了可能存在的权限问题,但存在 none。 spring 批处理文档指出 CommandLineJobRunner
可用于从 shell 中执行 运行 计划作业,但我们所有的作业都在执行后立即挂起。我们如何解决这个问题?
这似乎是 CommandLineJobRunner class 和 Skybot 之间的不兼容性。在决定用我自己的批处理 spring 替换 class 之后(加载应用程序上下文、构建 JobLauncher 等),我查看了 source code for CommandLineJobRunner。 main 方法提前调用了 System.in.available()
;当我们 运行 通过键入命令并按回车键来工作时,标准输入可以从键盘读取换行符。另一方面,作为标准输入的 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 非常相似,但不与标准输入进行任何交互。