我正在處理執行作業的 Spring Batch 應用程式。作業使用 Spring CRON 運算式進行調度。
在我的專案中,我有這個 SpringBatchExampleJobLauncher 類:
@Component
public class SpringBatchExampleJobLauncher {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringBatchExampleJobLauncher.class);
private final Job job;
private final JobLauncher jobLauncher;
private ExecutionContext executionContext;
@Autowired
public SpringBatchExampleJobLauncher(@Qualifier("updateNotaryDistrictsJob") Job job,
JobLauncher jobLauncher,
ExecutionContext executionContext) {
this.job = job;
this.jobLauncher = jobLauncher;
this.executionContext = executionContext;
}
@Scheduled(cron = "0/10 * * * * *")
public void runSpringBatchExampleJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
LOGGER.info("Spring Batch example job was started");
List<NotaryDistrict> notaryDistrictsList = new ArrayList<NotaryDistrict>();
executionContext.put("notaryDistrictsList", notaryDistrictsList);
jobLauncher.run(job, newExecution());
LOGGER.info("Spring Batch example job was stopped");
}
private JobParameters newExecution() {
Map<String, JobParameter> parameters = new HashMap<>();
JobParameter parameter = new JobParameter(new Date());
parameters.put("currentTime", parameter);
return new JobParameters(parameters);
}
}
在這個特定的例子中,使用的 CRON 例外是:
@Scheduled(cron = "0/10 * * * * *")
所以這項作業每 10 秒執行一次。這作業正常,但它不適用于實際情況。我必須每天在特定的時間和分鐘完成我的作業
根據這篇文章中顯示的內容: Spring cron vs normal cron?
還有這個檔案:https : //docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html
我知道,通過以下方式,我可以在每個月的第一天下午 12:00 執行我的作業。
"0 0 12 1 * *"
現在我有兩個問題:
出于測驗目的,我必須像每天 18:30 那樣執行我的作業(基本上,我不僅要指定小時,還要指定必須執行作業的時間。此外,我想每天執行它,而不是在上一個運算式指定的月份的第一天)。如何修改此 CRON 運算式以獲得所需的行為?
對于下一個生產階段,我必須更改此行為,以便在特定時間和特定周(例如每 2 周)的特定日期(例如今天)執行我的作業。例如:作業必須在該月的第一個星期一和第三個下午 02:30 執行。如何修改此 CRON 運算式以獲得所需的行為?
謝謝
uj5u.com熱心網友回復:
從Spring 檔案中,Cron 運算式的格式是:
┌───────────── second (0-59)
│ ┌───────────── minute (0 - 59)
│ │ ┌───────────── hour (0 - 23)
│ │ │ ┌───────────── day of the month (1 - 31)
│ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
│ │ │ │ │ ┌───────────── day of the week (0 - 7)
│ │ │ │ │ │ (or MON-SUN -- 0 or 7 is Sunday)
│ │ │ │ │ │
* * * * * *
- 您可以使用
0 30 18 * * *. Asterisk的*手段every在cron運算式。 - 為此,您可以使用
0 30 14 ? * MON#1,MON#3.MON#X指X每月的第一個星期一。在這種情況下,我們使用?月份欄位的日期,因為第一個/第三個星期一落在月份的哪一天并不重要。?表示沒有特定值。
uj5u.com熱心網友回復:
關于兩個問題:
首先,對于這種情況,您必須避免將 cron 運算式直接放在注釋中:
@Scheduled(cron = "0/10 * * * * *") // CURRENT
獲得解決方案的一個步驟是在 application.yml 中定義一個屬性,例如:
cron:
expresion: 0/10 * * * * *
和代碼:
@Scheduled(cron = "${cron.expression}")
這樣做,您可以按環境擁有一個 application.yml,即:application-prod.yml 與生產 cron,并使用 prod 組態檔運行它。甚至在啟動時通過命令列覆寫該屬性:
java -jar your-app.jar --cron.expression=0/15 * * * * *
相同的測驗案例,您的 application-test.yml 將具有用于測驗的 tunned 屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327873.html
上一篇:SQL注入學習筆記整理
下一篇:CSRF與SSRF學習筆記整理
