java - 从外部 jar 文件获取 spring boot 计划的 cron 表达式

标签 java spring spring-boot cron

我有一个 spring boot java 服务,我必须安排在特定时间运行。我已启用 @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: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/SchedulingConfigurer.html

这篇 DZone 文章展示了一个非常好的示例:https://dzone.com/articles/schedulers-in-java-and-spring我在这里展示它是为了防止文章不能永久保存。

@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);
            }
        });
    }
}

关于java - 从外部 jar 文件获取 spring boot 计划的 cron 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64057568/

相关文章:

java - 如何将任何图像转换为 JPG?

java - Spring Data Elasticsearch - 找不到能够从类型 [java.lang.Long] 转换为类型 [java.time.Instant] 的转换器

java - 如何动态调度不同的java类?

java - 带有 Java AWT 图形的 TTF 字体

java - 在 JFrame 上动态更改 JPanel 时出现问题

spring-boot - Docker的环境变量未传递给Spring

java - JPA Hibernate Postgres 错误 - 运算符不存在 : boolean = integer

spring - Mapstruct - 如何在 Generated Mapper 类中注入(inject) spring 依赖项

sql-server - 当我添加 sql 脚本时,Spring Boot 不起作用

javascript - 有没有一种简单的方法可以使用 dojo-toolkit 或 spring-js 创建确认对话框?