英文:
Can I change Spring Batch configuration to run statically?
问题
当使用 @Scheduled 注解时,它会动态执行。我可以将其更改为静态运行吗?
英文:
[Spring Batch] When @Scheduled annotation is used, it is executed dynamically. Can I change it to run statically?
答案1
得分: 0
因为你提到了@Scheduled,我想象你的批处理是从一个Web应用程序中执行的。如果你想要立即运行它,可以:
- 使用Spring Boot启动你的批处理,通过启动一个Spring Boot应用程序:我建议你按照这个教程操作,并将示例批处理替换为你自己的:https://spring.io/guides/gs/batch-processing/
- 从经典的Java应用程序中手动启动你的批处理,在启动时创建一个Spring上下文(这样Spring Boot可以更好地完成工作)
- 将你的批处理作为单元测试启动(用于集成目的):你可以按照这个教程操作(它也使用了Spring Boot):https://www.baeldung.com/spring-batch-testing-job
祝你好运。
英文:
Because you mention @Scheduled, I imagine your batch is executed from a web application. If you want to run it out of the box, you can :
- use Spring boot to start your batch by launching a spring boot application : I advise you to follow this tuto and replace the example batch by your own : https://spring.io/guides/gs/batch-processing/
- start your batch manually from a classic java application which create a spring context at start (so spring boot does the job really better)
- start your batch as a unit test (for integration purpose) : you can folow this tuto (which also use spring boot) :https://www.baeldung.com/spring-batch-testing-job
Good luck
答案2
得分: -1
我想我误解了你的问题。
如果你想要从静态方法运行,有一种方法可以实现。你可以创建一个类似以下方式的StaticJobInitializer组件:
@Component
public class StaticJobInitializer {
private JobRegistry jobRegistry;
private JobLauncher jobLauncher;
public StaticJobInitializer(JobRegistry jobRegistry, JobLauncher jobLauncher) {
this.jobRegistry = jobRegistry;
this.jobLauncher = jobLauncher;
}
@PostConstruct
public void init() {
StaticJobRun.setJobRegistry(jobRegistry);
StaticJobRun.setJobLauncher(jobLauncher);
}
}
public final class StaticJobRun {
private static JobRegistry jobRegistry;
private static JobLauncher jobLauncher;
public static JobRegistry getJobRegistry() {
return jobRegistry;
}
public static JobLauncher getJobLauncher() {
return jobLauncher;
}
public static void setJobLauncher(JobLauncher jobLauncher) {
StaticJobRun.jobLauncher = jobLauncher;
}
public static void setJobRegistry(JobRegistry jobRegistry) {
StaticJobRun.jobRegistry = jobRegistry;
}
}
然后,你的启动作业静态方法应该如下所示:
public static void startJob() {
Job job = StaticJobRun.getJobRegistry().getJob("job_name");
JobParameters jobParameters = new JobParametersBuilder()
.toJobParameters();
StaticJobRun.getJobLauncher().run(job, jobParameters);
}
请注意,我已经将HTML编码(")替换为正常的引号,以确保代码的正确性。
英文:
I think I misunderstood your question.
If you want to run from static method there is one way to do this. You can make StaticJobInitializer component like this
@Component
public class StaticJobInitializer {
private JobRegistry jobRegistry;
private JobLauncher jobLauncher;
public StaticJobInitializer(JobRegistry jobRegistry, JobLauncher jobLauncher) {
this.jobRegistry = jobRegistry;
this.jobLauncher = jobLauncher;
}
@PostConstruct
public void init() {
StaticJobRun.setJobRegistry(jobRegistry);
StaticJobRun.setJobLauncher(jobLauncher);
}
}
public final class StaticJobRun {
private static JobRegistry jobRegistry;
private static JobLauncher jobLauncher;
public static JobRegistry getJobRegistry() {
return jobRegistry;
}
public static JobLauncher getJobLauncher() {
return jobLauncher;
}
public static void setJobLauncher(JobLauncher jobLauncher) {
StaticJobRun.jobLauncher = jobLauncher;
}
public static void setJobRegistry(JobRegistry jobRegistry) {
StaticJobRun.jobRegistry = jobRegistry;
}
}
and than your start job static method should be like this:
public static void startJob(){
Job job = StaticJobRun.getJobRegistry().getJob("job_name");
JobParameters jobParameters = new JobParametersBuilder()
.toJobParameters();
StaticJobRun.getJobLauncher().run(job, new JobParameters());
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论