当前位置: 首页 > 知识库问答 >
问题:

Spring Batch CommandLineJobRunner在企业计划程序运行时挂起

夏弘义
2023-03-14
java -Dspring.profiles.active=production -jar AppName.jar jobs/jobName.xml jobId

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

共有1个答案

漆雕和昶
2023-03-14

这似乎是CommandLineJobRunner类和SkyBot之间的不兼容。在决定用我自己的批处理类替换spring批处理类(加载应用程序上下文、构造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();
    }
}
 类似资料:
  • 关于Java定时器类或ScheduledExecutorService接口,我可以在执行器线程(其他调度器)的运行方法(或TimerTask)内设置调度器(或定时器)吗? 案例研究:我有一个数据库,其中包含歌曲列表(10000首)和播放歌曲的时间表。 所以我想创建一个调度程序(比如1)(周期为1小时),它将搜索数据库,并为计划在一小时内播放的所有歌曲创建调度程序。 一小时后,scheduler1将

  • 我很想知道任务计划程序如何结束正在运行的任务。我已将一个应用程序添加到任务计划程序作业中,并且它接缝类似于在任务计划程序中为我的作业按 end 时(从任务计划程序启动它后),任务被窗口杀死(没有在我的应用程序中收到或消息)。我也没有找到一种方法来配置我希望如何在任务计划程序中关闭我的任务。我的目标是处理任务计划程序发送的消息(如果有)并很好地关闭我的应用程序。

  • 我有下面的代码,我用来检查哪个quartz调度程序作业正在运行。它还向我发送一封电子邮件,列出正在运行的调度程序作业。但我不知道它不会返回所有正在运行的调度程序作业。现在我只想知道那些有问题的调度程序作业,已经停止并且没有运行。我在我的生产环境中发现了一个关键问题,我发现一些调度程序作业没有运行,但我真的不知道它是哪个调度程序作业。

  • 我已经创建了一个Python包并在PyPI上发布了它,比如说< code>spamandeggs。这个软件包是跨平台的(Windows、GNU/Linux、MacOSX ),目的是定期(比如每5分钟)向用户更新某些信息。可以从命令行通过命令< code>spamtheeggs运行该包。 以下是我面临的问题: 问题01:如何对通过< code>spamtheeggs命令运行的脚本进行daemoniz

  • 假设我想在2020年2月6日13:50运行一次作业。我该怎么做? 通过使用下面的表达式,我可以得出它将在今天13:50运行。但它明年也会运行。但我希望它只运行一次。

  • 我有一套使用spring框架用Java写的服务。一些服务有预定的任务(使用spring的< code>@Scheduled注释)来做一些内务处理(生成处理过的数据,数据清理等。).由于这些计划任务,我不能运行服务的多个实例,因为所有实例都选择相同的任务,并且多次执行,导致重复/损坏的数据。为了解决这个问题,我想在任务执行时进行检查,并且只允许在一个实例上执行。我该怎么做?这个问题有更好的解决方法吗