如何 运行 Spring 以与 spring.batch.job.enabled=true 相同的方式进行批处理

How to run Spring Batch the same way like spring.batch.job.enabled=true

我正在学习 spring 批处理,并遵循来自 https://spring.io/guides/gs/batch-processing/

我认为要阻止 spring 批处理在启动应用程序时自动启动,我必须设置 spring.batch.job.enabled=false

我的问题是如何手动触发它?在控制台中按下 return 键后,我尝试了以下触发作业但它不起作用(它使用 spring.batch.job.enabled=true 并且没有 JobLauncherController class)

@SpringBootApplication
public class BatchProcessingApplication {
public static void main(String[] args) throws Exception
    {
        SpringApplication.run(BatchProcessingApplication.class, args);
        new Scanner(System.in).nextLine();
        new JobLauncherController().launchJob();
    }
}

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job importUserJob;

    public void launchJob() throws Exception{
        JobParameters parameters = new JobParametersBuilder()
          .addLong("run.id", new Date().getTime()).toJobParameters();

        jobLauncher.run(importUserJob, parameters);
}

使 JobLauncherController 成为 Rest 控制器

@RestController
@RequestMapping("/launch/job")
public class JobLauncherController {

并通过 Get 映射使您的方法成为 Get 端点。你可以通过邮递员测试它,方法是 运行 在你 运行 你的 spring 批处理应用程序启动后,使用 http://localhost:8080/launch/job GET Rest 端点。您肯定必须配置 @scheduler 或由人或其他应用程序触发的休息端点,以适当地 运行 spring 批处理。在你的情况下,因为你提到你想要手动 运行 它,通常使用休息端点来触发批处理作业。希望这有帮助。

@GetMapping
public void launchJob() throws Exception{

当您使用 new JobLauncherController() 时,您是在自己创建对象,而不是从 Spring 应用程序上下文中获取 bean。因此,依赖注入不适用于您的对象,并且不会注入协作者。如果你想手动 运行 作业,你可以绕过控制器,像这样:

@SpringBootApplication
public class BatchProcessingApplication {

   public static void main(String[] args) throws Exception {
        new Scanner(System.in).nextLine();
        ApplicationContext context = SpringApplication.run(BatchProcessingApplication.class, args);
        Job job = context.getBean(Job.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        JobParameters parameters = new JobParametersBuilder()
          .addLong("run.id", new Date().getTime())
          .toJobParameters();

        jobLauncher.run(job, parameters);
    }
}