Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从外部jar文件获取spring引导计划的cron表达式_Java_Spring_Spring Boot_Cron - Fatal编程技术网

Java 从外部jar文件获取spring引导计划的cron表达式

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

我有一个SpringBootJava服务,我必须安排在特定时间运行。我已经启用了
@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这是一个好问题。我不知道该怎么做。如果我找到什么,我会把它加在这里。我也在这里问了一个问题: