gpt4 book ai didi

spring - 如何使用 ThreadPoolTask​​Scheduler 动态调度 Spring Batch 作业

转载 作者:行者123 更新时间:2023-12-02 05:41:30 25 4
gpt4 key购买 nike

我有一个 Spring Batch 应用程序,我想在其中安排作业调用。

在构建时调度间隔是未知的,因此我不能只用 @Scheduled 注释我的作业。这导致我使用 ThreadPoolTask​​Scheduler。

问题是方法 Schedule 采用 Runnable 作为参数。可以这样安排工作吗?我可以直接从以下服务调用该作业,但无法安排它。

这是我的问题的背景,我试图让它变得简单:

@Service
public class ScheduledProcessor{
private final ThreadPoolTaskScheduler threadPoolTaskScheduler;
private Application application;
@Autowired
public ScheduledProcessor(ThreadPoolTaskScheduler threadPoolTaskScheduler, Application application){
this.threadPoolTaskScheduler = threadPoolTaskScheduler;
this.application = application;
scheduledTasks = new ArrayList();


Trigger trigger = new CronTrigger("0/6 * * * * *");
//Here I am trying to schedule my job.
//The following line is wrong because a Job can't be cast to a Runnable but I wanted to show the intended behaviour.
threadPoolTaskScheduler.schedule((Runnable) application.importUserjob, trigger);
System.out.println("Job launch !");
}

这是 JobBuilderFactory :

@Bean
public Job importUserJob(JobBuilderFactory jobs, Step s1, Step s2) {
return jobs.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(s1)
.end()
.build();
}

我明白(好吧,我什至不确定)我不能直接将作业转换为可运行的,但是否可以以任何方式将其转换?或者您能给我一些关于使用什么来动态安排 Spring 批处理作业的建议吗?

如果发生更改,我还需要能够重新启动/跳过我的步骤,就像我目前使用 threadPoolTask​​Scheduler 所做的那样。

预先感谢您提供的任何帮助或提示。

最佳答案

我终于知道怎么做了!

我创建了一个实现 Runnable 的类(为了方便起见,扩展了 Thread,这样就无需实现所有 Runnable 类)。

@Component
public class MyRunnableJob extends Thread implements Runnable{

private Job job;
private JobParameters jobParameters;
private final JobOperator jobOperator;

@Autowired
public MyRunnableJob(JobOperator jobOperator) {
this.jobOperator = jobOperator;
}

public void setJob(Job job){
this.job=job;
}

@Override
public void run(){
try {
String dateParam = new Date().toString();
this.jobParameters = new JobParametersBuilder().addString("date", dateParam).toJobParameters();
System.out.println("jobName : "+job.getName()+" at "+dateParam);

jobOperator.start(job.getName(), jobParameters.toString());
} catch (NoSuchJobException | JobInstanceAlreadyExistsException | JobParametersInvalidException ex) {
Logger.getLogger(MyRunnableJob.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

在我的 ScheduledProcessor 类中,我将 Job 设置为 myRunnable 类,然后将其作为 Schedule 方法的参数传递。

public class SchedulingProcessor {

//Autowired fields :
private final JobLauncher jobLauncher;
private final Job importUserJob;
private final ThreadPoolTaskScheduler threadPoolTaskScheduler;
private final MyRunnableJob myRunnableJob;


//Other fields :
private List<ScheduledFuture> scheduledTasks;


@Autowired
public SchedulingProcessor(JobLauncher jobLauncher, Job importUserJob, ThreadPoolTaskScheduler threadPoolTaskScheduler, MyRunnableJob myRunnableJob) throws Exception {
this.jobLauncher=jobLauncher;
this.importUserJob=importUserJob;
this.threadPoolTaskScheduler=threadPoolTaskScheduler;
this.myRunnableJob=myRunnableJob;
Trigger trigger = new CronTrigger("0/6 * * * * *");
myRunnableJob.setJob(this.importUserJob);
scheduledTasks = new ArrayList();
scheduledTasks.add(this.threadPoolTaskScheduler.schedule((Runnable) myRunnableJob, trigger));
}
}

scheduledTasks 列表只是为了控制我刚刚安排的任务。

这个技巧使我能够动态地(感谢 ThreadPoolTask​​Scheduler)调度封装在实现 Runnable 的类中的 Spring Batch 作业。我希望它可以帮助与我有同样情况的人。

关于spring - 如何使用 ThreadPoolTask​​Scheduler 动态调度 Spring Batch 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com