簡體   English   中英

在 spring boot 應用程序中安排多個批處理作業

[英]scheduling more than one batch job in spring boot application

我的 spring boot 批處理應用程序有一個調度程序,它安排我在 FirstBatchConfiguration 類中編寫的批處理作業每小時運行一次。

我有另一個批處理作業,我在同一個應用程序的 SecondBatchConfiguration 類中配置了它,我將安排它每周運行一次,但我無法弄清楚如何在同一個 JobScheduler 中安排它,以便兩個作業都應該運行在他們自己安排的時間。

如果有人可以幫助我實現這一目標。

我當前的調度程序是:

@Component
public class JobScheduler {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private FirstBatchConfiguration firstBatchConfiguration;

    @Scheduled(cron = "0 0 0/1 * * ?")
    public void runJob() {

        Map<String, JobParameter> confMap = new HashMap<>();
        confMap.put("time", new JobParameter(System.currentTimeMillis()));
        JobParameters jobParameters = new JobParameters(confMap);
        final Logger logger = LoggerFactory.getLogger("applicationlogger");

        try {

            jobLauncher.run(firstBatchConfiguration.firstJob(), jobParameters);

        } catch (JobExecutionAlreadyRunningException | JobInstanceAlreadyCompleteException
                | JobParametersInvalidException | org.springframework.batch.core.repository.JobRestartException e) {

            logger.error(e.getMessage());
        }
    }

}

如果程序必須運行第二個計划,則添加一個帶有計划注釋的新方法,例如@Scheduled(cron = "5 8 * * 6?") 如果您需要使用 SecondBatchConfiguration 類,那么只需將其自動裝配即可。

  1. 第 1 步(自動連接您的配置) @Autowired您的SecondBatchConfiguration

例子:

@Autowired
private SecondBatchConfiguration secondBatchConfiguration;
  1. 創建一個新方法並使用 @Scheduled 注釋對其進行調度,並在方法體中啟動第二個作業。

例子:

@Scheduled(cron = "5 8 * * 6 ?")
public void runSecondJob() { ... }

您可以根據需要擁有多個時間表,每個時間表都有自己的時間表。

@Scheduled(cron = "5 8 * * 6 ?")
public void runSecondJob() { .... }

@Scheduled(cron = "0 0 0/1 * * ?")
public void runJob() { .... }

編輯:異步作業執行

異步作業執行是 spring batch 的一個非常強大的特性,有很好的文檔和示例。

請參閱以下說明以激活異步作業異常:

第 1 步:添加作業配置(此替代方案使用 In-Memory JobRepository)。 要閱讀有關存儲庫類型的更多信息,請轉到Spring 文檔

創建 ResourcelessTransactionManager Bean

   @Bean
    public ResourcelessTransactionManager transactionManager() {
        return new ResourcelessTransactionManager();
    }

創建 MapJobRepositoryFactory Bean

@Bean
public MapJobRepositoryFactoryBean mapJobRepositoryFactory(
        ResourcelessTransactionManager txManager) throws Exception {
    MapJobRepositoryFactoryBean factory = new
            MapJobRepositoryFactoryBean(txManager);
    factory.afterPropertiesSet();
    return factory;
}

創建 JobRepository Bean

@Bean
public JobRepository jobRepository(
        MapJobRepositoryFactoryBean factory) throws Exception {
    return factory.getObject();
}

創建一個ThreadPoolExecutor(ThreadPoolExecutor負責Async執行,執行器的種類更多,你可以在Spring Documentation中閱讀更多關於它們的信息)

@Bean
public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(5);
    taskExecutor.setMaxPoolSize(10);
    taskExecutor.setQueueCapacity(30);
    return taskExecutor;
}

創建一個 JobLauncher bean

   @Bean
    public JobLauncher jobLauncher(ThreadPoolTaskExecutor taskExecutor, JobRepository jobRepository){
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setTaskExecutor(taskExecutor);
        jobLauncher.setJobRepository(jobRepository);
        return jobLauncher;
    }

第 2 步:啟用異步作業執行

轉到您的 Spring Boot 應用程序類和以下注釋

@EnableBatchProcessing
@EnableAsync
@EnableScheduling
@SpringBootApplication
public class MyBatchApp {

默認情況下,Spring Boot 將只使用一個線程來運行所有計划任務。 這些任務將被阻塞。 相反,我會將調度程序配置為在單獨的線程中運行每個計划任務:

@Configuration
public class SchedulerConfig implements SchedulingConfigurer
{    private final int POOL_SIZE = 10;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar)
    {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM