![](/img/trans.png)
[英]Quartz scheduling a job on every Application Run in 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 類,那么只需將其自動裝配即可。
@Autowired
您的SecondBatchConfiguration
例子:
@Autowired
private SecondBatchConfiguration secondBatchConfiguration;
例子:
@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.