2017-07-31 123 views
1

我的彈簧引導批處理應用程序有一個調度程序,它將我的批處理作業編寫在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()); 
     } 
    } 

} 
+0

你也可以看石英。這非常簡單並且有據可查。 – Someone

回答

1

如果程序有運行第二個時間表,然後用附表標註添加一個新的方法,例如@Scheduled(cron = "5 8 * * 6 ?")。如果您需要使用SecondBatchConfiguration類,那麼只需Autowired它。

  1. 第一步(自動裝配配置)@AutowiredSecondBatchConfiguration

實施例:

@Autowired 
private SecondBatchConfiguration secondBatchConfiguration; 
  • 創建一個新的方法,並用@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() { .... } 
    

    編輯:異步作業執行

    異步工作excecution是春天一批非常強大的功能,有一個很好的文檔和它的例子。

    請參見下面的說明,以激活異步工作異常:

    第1步:添加作業配置(本項選擇使用內存JobRepository)。要了解更多有關存儲庫的類型去Spring Documentation

    創建ResourcelessTransactionManager豆

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

    創建MapJobRepositoryFactory豆

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

    創建JobRepository豆

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

    創建的ThreadPoolExecutor(ThreadPoolExecutor的負責異步執行的,也有更多類型的執行者,你可以在Spring Documentation閱讀更多關於他們)

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

    創建JobLauncher豆

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

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

    轉到您Spring Boot Application Class和下列註釋

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

    該解決方案正常工作,但作業不是並行運行。如果他們的預定時間發生衝突,一個工作正在等待另一個工作完成執行。我們可以讓這些工作獨立於其他執行時間嗎? – user466

    +0

    請轉到答案,我只是發佈如何啓用異步作業執行的示例。希望能幫助到你。 –

    +0

    以上解決方案完美無缺......謝謝!!! – user466

    相關問題