Spring Batch ExitCodeGenerator在tasklet中抛出异常时

l7mqbcuq  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(145)

在我的Spring Batch Application中,我希望根据抛出的Exception返回不同的退出代码。
因此,我遵循以下文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.spring-application.application-exit
并在我的异常中实现了ExitCodeGenerator:

  1. class MyCustomException(message: String) : RuntimeException(message), ExitCodeGenerator {
  2. override fun getExitCode(): Int {
  3. return 13
  4. }
  5. }

字符串
这个异常在一个tasklet中抛出,应用程序运行如下:

  1. @SpringBootApplication
  2. class MyApplication
  3. fun main(args: Array<String>) {
  4. exitProcess(
  5. SpringApplication.exit(
  6. runApplication<MyApplication>(*args)
  7. )
  8. )
  9. }


但是当异常被抛出时,应用程序失败,退出代码为5。看起来步骤中的异常没有传播到检查异常退出代码的SpringApplication.run()。这个Sping Boot 功能与Spring批处理行为不兼容吗?或者我错过了什么?

6uxekuva

6uxekuva1#

在我的异常中实现ExitCodeGenerator
异常类型不应该是ExitCodeGenerator,而应该是相反的:ExitCodeGenerator应该返回基于异常类型的退出代码。
Sping Boot 会发出一个带有JobExecutionJobExecutionEvent,所以你可以让你的自定义ExitCodeGenerator成为这种类型事件的侦听器,比如:

  1. package com.example.demo;
  2. import org.springframework.batch.core.ExitStatus;
  3. import org.springframework.batch.core.Job;
  4. import org.springframework.batch.core.JobExecution;
  5. import org.springframework.batch.core.Step;
  6. import org.springframework.batch.core.job.builder.JobBuilder;
  7. import org.springframework.batch.core.repository.JobRepository;
  8. import org.springframework.batch.core.step.builder.StepBuilder;
  9. import org.springframework.boot.ExitCodeGenerator;
  10. import org.springframework.boot.SpringApplication;
  11. import org.springframework.boot.autoconfigure.SpringBootApplication;
  12. import org.springframework.boot.autoconfigure.batch.JobExecutionEvent;
  13. import org.springframework.context.ApplicationListener;
  14. import org.springframework.context.annotation.Bean;
  15. import org.springframework.transaction.PlatformTransactionManager;
  16. @SpringBootApplication
  17. public class DemoApplication {
  18. public static void main(String[] args) {
  19. System.exit(
  20. SpringApplication.exit(
  21. SpringApplication.run(DemoApplication.class, args)
  22. )
  23. );
  24. }
  25. @Bean
  26. public Job job(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
  27. Step step = new StepBuilder("step", jobRepository)
  28. .tasklet((contribution, chunkContext) -> {
  29. throw new Exception("Boom");
  30. }, transactionManager).build();
  31. return new JobBuilder("job", jobRepository)
  32. .start(step)
  33. .build();
  34. }
  35. @Bean
  36. public ExitCodeGenerator exitCodeGenerator () {
  37. return new MyExitCodeGenerator();
  38. }
  39. static class MyExitCodeGenerator implements ExitCodeGenerator, ApplicationListener<JobExecutionEvent> {
  40. private JobExecution jobExecution;
  41. @Override
  42. public int getExitCode() {
  43. ExitStatus exitStatus = jobExecution.getExitStatus();
  44. if (ExitStatus.FAILED.getExitCode().equals(exitStatus.getExitCode())) {
  45. return 13;
  46. }
  47. return 0;
  48. }
  49. @Override
  50. public void onApplicationEvent(JobExecutionEvent jobExecutionEvent) {
  51. this.jobExecution = jobExecutionEvent.getJobExecution();
  52. }
  53. }
  54. }

字符串
如果你运行这个应用程序,进程的退出代码应该是13。该项目是从start.spring.io生成的,带有这个链接。

展开查看全部

相关问题