Java 从外部jar文件获取spring引导计划的cron表达式
我有一个SpringBootJava服务,我必须安排在特定时间运行。我已经启用了Java 从外部jar文件获取spring引导计划的cron表达式,java,spring,spring-boot,cron,Java,Spring,Spring Boot,Cron,我有一个SpringBootJava服务,我必须安排在特定时间运行。我已经启用了@Enablescheduling和@Scheduled注释,并给出了cron表达式 很好用。计划程序正在预期时间运行。但我关心的是,我应该从jar文件之外的某个地方控制cron表达式。我曾尝试在属性文件中使用它,但在打包属性文件时,它也包含在其中 示例代码: @PostMapping(path = "getoktatodynamodb") @Scheduled(cron = &q
@Enablescheduling
和@Scheduled
注释,并给出了cron表达式
很好用。计划程序正在预期时间运行。但我关心的是,我应该从jar文件之外的某个地方控制cron表达式。我曾尝试在属性文件中使用它,但在打包属性文件时,它也包含在其中
示例代码:
@PostMapping(path = "getoktatodynamodb")
@Scheduled(cron = "0 0/5 0 * * ?")
@ApiOperation("Sync data to DynamoDB")
public FinalResponse getdatatodynamodb() {
FinalResponse finalResponse = new FinalResponse();
try {
LOGGER.info("Sync data to DynamoDB starts - " + new Date());
finalResponse = dynamodbuserService.dynamoDbSync();
} catch (MyRestTemplateException ex) {
LOGGER.error(ex.getMessage());
finalResponse.setResponseMessage(ex.getMessage());
finalResponse.setStatusCode(ex.getStatusCode().value());
} catch (Exception execption) {
LOGGER.error(execption.getMessage());
finalResponse.setResponseMessage(execption.getMessage());
finalResponse.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
} finally {
LOGGER.info("Sync data DynamoDB Ends - " + new Date());
}
return finalResponse;
}
主要目的是当我们需要更改时间时,调度程序应该在我们的控制下,它应该是可配置的。无代码更改,并重新启动计划程序以进行微小更改
我们应该如何实现这一点?我们希望在linux ec2实例中安排这一点?如果我们对此有更好的建议,请分享。您可以实施SchedulingConfigurer: 这篇DZone文章展示了一个非常好的例子:我在这里展示的例子是为了防止这篇文章不能永久保存
@Configuration
@EnableScheduling
public class ScheduledConfiguration implements SchedulingConfigurer {
TaskScheduler taskScheduler;
private ScheduledFuture<?> job1;
private ScheduledFuture<?> job2;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler =new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);// Set the pool of threads
threadPoolTaskScheduler.setThreadNamePrefix("scheduler-thread");
threadPoolTaskScheduler.initialize();
job1(threadPoolTaskScheduler);// Assign the job1 to the scheduler
// Assign the job1 to the scheduler
this.taskScheduler=threadPoolTaskScheduler;// this will be used in later part of the article during refreshing the cron expression dynamically
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
private void job1(TaskScheduler scheduler) {
job1 = scheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " The Task1 executed at " + new Date());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
String cronExp = "0/5 * * * * ?";// Can be pulled from a db .
return new CronTrigger(cronExp).nextExecutionTime(triggerContext);
}
});
}
private void job2(TaskScheduler scheduler){
job2=scheduler.schedule(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" The Task2 executed at "+ new Date());
}
}, new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
String cronExp="0/1 * * * * ?";//Can be pulled from a db . This will run every minute
return new CronTrigger(cronExp).nextExecutionTime(triggerContext);
}
});
}
}
@配置
@使能调度
公共类ScheduledConfiguration实现SchedulingConfigurer{
任务调度器任务调度器;
私人计划的未来工作1;
私人计划的未来工作2;
@凌驾
公共无效配置任务(ScheduledTaskRegistrar任务注册器){
ThreadPoolTaskScheduler ThreadPoolTaskScheduler=新的ThreadPoolTaskScheduler();
setPoolSize(10);//设置线程池
setThreadNamePrefix(“调度程序线程”);
threadPoolTaskScheduler.initialize();
job1(threadPoolTaskScheduler);//将job1分配给调度程序
//将作业1分配给调度程序
this.taskScheduler=threadPoolTaskScheduler;//本文后面将在动态刷新cron表达式时使用此选项
taskRegistrar.setTaskScheduler(线程池任务调度器);
}
专用无效作业1(任务计划程序){
job1=scheduler.schedule(新的Runnable(){
@凌驾
公开募捐{
System.out.println(Thread.currentThread().getName()+”在“+新日期()执行的Task1);
试一试{
睡眠(10000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
},新触发器(){
@凌驾
公共日期下一个执行时间(TriggerContext TriggerContext){
字符串cronExp=“0/5****?”;//可以从数据库中提取。
返回新的CronTrigger(cronExp).nextExecutionTime(triggerContext);
}
});
}
专用无效作业2(任务计划程序){
job2=scheduler.schedule(新的Runnable(){
@凌驾
公开募捐{
System.out.println(Thread.currentThread().getName()+”在“+新日期()执行的Task2);
}
},新触发器(){
@凌驾
公共日期下一个执行时间(TriggerContext TriggerContext){
字符串cronExp=“0/1****?”;//可以从数据库中提取。这将每分钟运行一次
返回新的CronTrigger(cronExp).nextExecutionTime(triggerContext);
}
});
}
}
请阅读此线程:。我不确定这是否是一个重复,因为你也会问:“没有代码更改,重新启动调度程序进行小的更改。”你这是什么意思?是否要在运行时根据某些参数动态更改作业频率?如果不重新启动?您使用的是Spring Boot,请定义一个属性(在应用程序.properties
中设置默认值)并使用参数或环境变量进行重写。如何在上述给定的实现中设置重试限制。请建议,如果出现任何错误,我应该通知我的作业调度程序在15分钟后重试一次,然后它不应该再次轮询。@tune5ths-我必须实现与Mohan上面提到的相同的事情,我们将如何设置重试尝试?@Mohanvel和Sanjay这是一个好问题。我不知道该怎么做。如果我找到什么,我会把它加在这里。我也在这里问了一个问题: