如何使用ThreadPoolTaskScheduler动态调度Spring Batch作业

Midemarc

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

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

问题是方法进度表将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();
}

我了解(嗯,我什至对此不确定)我不能直接将Job转换为Runnable,但是可以以任何方式转换它吗?或者,您可以给我一些有关如何动态调度Spring Batch作业的建议吗?

如果发生了某些变化,我还需要能够重新启动/跳过我的步骤,就像我目前使用threadPoolTask​​Scheduler一样。

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

Midemarc

我终于知道该怎么做了!

我创建了一个实现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));
    }        
}

scheduleTasks列表只是为了控制我刚刚计划的任务。

这个技巧使我能够动态地(由于ThreadPoolTask​​Scheduler)调度封装在实现Runnable的类中的Spring Batch Jobs。我希望它可以在我的情况下为某人提供帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重复的Spring Batch作业实例

来自分类Dev

Spring Batch - 使用相同的作业参数重新运行作业

来自分类Dev

如何并行运行Spring Batch作业

来自分类Dev

如何控制并行Spring Batch作业的数量

来自分类Dev

如何在Spring Cloud Data Flow中为Spring Batch作业设置调度程序?

来自分类Dev

运行Spring Batch作业的最佳方法

来自分类Dev

用于多个Spring Batch作业的JobRepository

来自分类Dev

如何使用批注在Spring Batch中运行多个作业

来自分类Dev

如何使用Spring Batch查看集群中的所有作业?

来自分类Dev

如何使用不同的作业参数多次运行spring batch作业?

来自分类Dev

使用 Spring Boot 连续运行 Spring Batch 作业

来自分类Dev

如何在线程池中运行spring-batch作业?

来自分类Dev

Spring Batch如何在作业之间共享数据

来自分类Dev

Spring Batch如何在作业之间共享数据

来自分类Dev

使用不同的参数同时执行多个Spring Batch作业

来自分类Dev

使用持久订阅者的Spring Batch分区作业

来自分类Dev

如何从Spring Batch Processor Process()方法引发异常到Spring Batch作业启动方法?

来自分类Dev

如何在Spring Batch管理员UI中创建和部署Spring Batch作业

来自分类Dev

从命令行运行Spring Batch作业

来自分类Dev

Spring Batch暂停并重新启动作业

来自分类Dev

Spring Batch-作业停止时中断线程

来自分类Dev

在Spring Batch中以编程方式运行作业时出现NoSuchJobException

来自分类Dev

Spring Batch线程安全的Map作业存储库

来自分类Dev

Spring Batch中的作业执行已过期

来自分类Dev

Spring Batch:根据itemReader中的结果执行作业

来自分类Dev

Spring Batch作业流程等待某些用户操作

来自分类Dev

重新启动由多个线程运行的Spring Batch作业

来自分类Dev

在集群环境中避免Spring Batch作业中的并发

来自分类Dev

作业执行期间的 Spring Batch UNKNOWN 状态

Related 相关文章

  1. 1

    重复的Spring Batch作业实例

  2. 2

    Spring Batch - 使用相同的作业参数重新运行作业

  3. 3

    如何并行运行Spring Batch作业

  4. 4

    如何控制并行Spring Batch作业的数量

  5. 5

    如何在Spring Cloud Data Flow中为Spring Batch作业设置调度程序?

  6. 6

    运行Spring Batch作业的最佳方法

  7. 7

    用于多个Spring Batch作业的JobRepository

  8. 8

    如何使用批注在Spring Batch中运行多个作业

  9. 9

    如何使用Spring Batch查看集群中的所有作业?

  10. 10

    如何使用不同的作业参数多次运行spring batch作业?

  11. 11

    使用 Spring Boot 连续运行 Spring Batch 作业

  12. 12

    如何在线程池中运行spring-batch作业?

  13. 13

    Spring Batch如何在作业之间共享数据

  14. 14

    Spring Batch如何在作业之间共享数据

  15. 15

    使用不同的参数同时执行多个Spring Batch作业

  16. 16

    使用持久订阅者的Spring Batch分区作业

  17. 17

    如何从Spring Batch Processor Process()方法引发异常到Spring Batch作业启动方法?

  18. 18

    如何在Spring Batch管理员UI中创建和部署Spring Batch作业

  19. 19

    从命令行运行Spring Batch作业

  20. 20

    Spring Batch暂停并重新启动作业

  21. 21

    Spring Batch-作业停止时中断线程

  22. 22

    在Spring Batch中以编程方式运行作业时出现NoSuchJobException

  23. 23

    Spring Batch线程安全的Map作业存储库

  24. 24

    Spring Batch中的作业执行已过期

  25. 25

    Spring Batch:根据itemReader中的结果执行作业

  26. 26

    Spring Batch作业流程等待某些用户操作

  27. 27

    重新启动由多个线程运行的Spring Batch作业

  28. 28

    在集群环境中避免Spring Batch作业中的并发

  29. 29

    作业执行期间的 Spring Batch UNKNOWN 状态

热门标签

归档