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

当从机完成时,如何在Spring Batch远程组块中停止作业?

乔丁雨
2023-03-14

我使用这个示例作为spring batch应用程序的起点,使用远程分块:https://github.com/benas/spring-batch-remote-chunking-sample/blob/master/src/main/java/io/github/benas/masterconfiguration.java在这个示例中,我添加了自定义的读取器/写入器,但没有更改任何配置。这个例子工作很好,除了我不能停止工作后,所有的奴隶完成。

我尝试使用JobListner,在“after job”方法中停止作业,但没有结果。

public class MyJobExecutionListener implements JobExecutionListener {

@Override
public void beforeJob(JobExecution jobExecution) {
    // TODO Auto-generated method stub

}

@Override
public void afterJob(JobExecution jobExecution) {

    System.out.println("afterJob start~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println(jobExecution.getExitStatus().getExitCode());
    System.out.println(jobExecution.getExitStatus().getExitDescription());
    System.out.println(jobExecution.getStartTime());
    System.out.println(jobExecution.getEndTime());
    System.out.println(jobExecution.isRunning());
    System.out.println(jobExecution.isStopping());

    jobExecution.stop();

    System.out.println("!!!!!!!!!");
    System.out.println(jobExecution.isRunning());
    System.out.println(jobExecution.isStopping());
    System.out.println(jobExecution.getEndTime());


    System.out.println("afterJob end~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}

}

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class AppStarter {

   public static void main(String[] args) {

      System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!! start");
      SpringApplication.run(AppStarter.class, args);

   }
}

有没有办法在应用程序完成后停止?

共有1个答案

闻人吕恭
2023-03-14

您可以使用如下内容显式地停止主程序的应用程序上下文:

ConfigurableApplicationContext context = SpringApplication.run(YourMasterApp.class, args);
context.close();

这将确保主端已经完成作业的运行,然后关闭应用程序上下文。

不过有几个注意事项:

  • 您可以在官方示例repo中找到相同的示例:https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples#remote-chunking-sample。您用作起始点的个人回购可能随时被删除
  • 在监听器的afterjob方法中使用jobexecution.stop()没有意义,因为这个afterjob方法几乎是结束作业之前的最后一条语句。此外,这个jobexecution.stop()将在将来的版本中删除(请参见https://jira.spring.io/browse/batch-1987)

希望这能有所帮助。

 类似资料:
  • 问题内容: 我在另一台计算机上运行ffmpeg进行屏幕捕获。我希望能够停止它的远程录制。FFMPEG要求按q停止编码,因为它必须进行一些最终确定才能完全整理文件。我知道我可以使用kill / killall杀死它,但这可能会导致视频损坏。 我在Google上找不到专门用于此目的的任何东西,但是有人建议将回显到/ proc // fd / 0起作用。 我已经尝试过了,但是它并没有停止ffmpeg。但

  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • 我正在尝试为Flink流媒体作业创建JUnit测试,该作业将数据写入kafka主题,并分别使用和从同一kafka主题读取数据。我正在通过生产中的测试数据: 以及检查来自消费者的数据是否与以下数据相同: 使用。 通过打印流,我能够看到来自消费者的数据。但无法获得Junit测试结果,因为即使消息完成,使用者仍将继续运行。所以它并没有来测试这个部件。 在或中是否有任何方法停止进程或运行特定时间?

  • 我正在使用python-telegram-bot处理一个Telegram bot,我希望停止运行Telegram.job对象。 例如,我希望在hello函数处于while循环时停止运行该函数。 问题是,当我在作业开始前使用end命令时(最初10秒),它可以正常工作并停止作业,但当我在运行作业时使用end命令时,它什么也不做,因为正在运行的作业不在作业队列中。 你知道吗?如何停止正在运行的作业?

  • 如果一项工作没有在10分钟内完成,在接下来的10分钟内另一项工作将开始。 我想要的是:下一个作业(每10分钟后)应该启动,只有在前一个作业已经完成运行的情况下。有什么办法可以做到吗?

  • 问题内容: 我在主线程中创建一个,然后创建一个内部类线程来侦听端口。当我在主线程中关闭时,它总是遇到错误,因为在内部类线程中我调用了该方法,并且它阻塞了内部类线程。这是内部类的代码: 我想在关闭DatagramSocket之前停止内部类线程,但是不建议使用该方法。我怎样才能做到这一点? 问题答案: 关闭套接字,这将阻止阻止receive()调用。如果您首先设置了一个关闭标志,那么在catch(IO