当前位置: 首页 > 面试题库 >

使用Cron安排任务以允许动态更新

宰父淳
2023-03-14
问题内容

我使用Spring 4.2的sprint boot 1.3

在这个班上

@Service
public class PaymentServiceImpl implements PaymentService {
    ....
    @Transactional
    @Override
    public void processPayment() {
        List<Payment> payments = paymentRepository.findDuePayment();
        processCreditCardPayment(payments);
    }
}

我想每隔x分钟打电话给processPayment。

这x时刻设置在数据库中。用户可以修改它。

所以我认为我不能使用注释。

我开始这个

@EntityScan(basePackageClasses = {MyApp.class,     Jsr310JpaConverters.class})
@SpringBootApplication
@EnableCaching
@EnableScheduling
public class MyApp {

    @Autowired
    private DefaultConfigService defaultConfigService;

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

    @Bean
    public TaskScheduler poolScheduler() {
        SimpleAsyncTaskExecutor taskScheduler = new SimpleAsyncTaskExecutor();

        DefaultConfigDto defaultConfigDto = defaultConfigService.getByFieldName("payment-cron-task");
        String cronTabExpression = "0 0 4 * * ?";
        if (defaultConfigDto != null && !defaultConfigDto.getFieldValue().isEmpty()) {
            cronTabExpression = "0 0 4 * * ?";
        }

        appContext.getBean("scheduler");

        taskScheduler.schedule(task, new CronTrigger(cronTabExpression));
        return scheduler;
    }

也许这不是好方法。

有什么建议吗?

如果我需要创建类似的属性,不知道是否能获得我的上下文

@Autowired
ConfigurableApplicationContext context;

然后在主要

public static void main(String[] args) {
        context = SpringApplication.run(MyApp.class, args);
}

问题答案:

看问题似乎要更新调度程序,而无需重新启动。

您共享的代码仅确保从数据库中选择配置,但是如果不重新启动应用程序,它将不会刷新。

以下代码将使用spring上下文中可用的默认调度程序,并根据数据库中可用的cron设置动态计算下一次执行时间:

这是示例代码:

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

@SpringBootApplication
@EnableScheduling
public class Perses implements SchedulingConfigurer {
    private static final Logger log = LoggerFactory.getLogger(Perses.class);

    @Autowired
    private DefaultConfigService defaultConfigService;

    @Autowired
    private PaymentService paymentService;

    public static void main(String[] args) {
        SpringApplication.run(Perses.class, args);
    }

    private String cronConfig() {
        String cronTabExpression = "*/5 * * * * *";
        if (defaultConfigDto != null && !defaultConfigDto.getFieldValue().isEmpty()) {
            cronTabExpression = "0 0 4 * * ?";
        }
        return cronTabExpression;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                paymentService.processPayment();
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                String cron = cronConfig();
                log.info(cron);
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExec = trigger.nextExecutionTime(triggerContext);
                return nextExec;
            }
        });
    }
}


 类似资料:
  • 我必须执行简单的cron作业。例如,每天上午10点,我必须打开一个链接,然后链接做所有的工作。为此,我使用cron-job.org。 然而事情变得复杂了,我需要一个关于我应该如何进行的建议。 这个任务很简单,每天在某个时间,我必须执行这个作业(打开一个链接),但是这个时间是动态的,我从JSON数据中获取。 真正的问题是,我需要在每天00:00阅读一个json,其中包含作业在该特定日子必须执行的时间

  • 在过去的几天里,我一直在和Spring保安公司战斗,所以我希望有人能在这里帮助我。 我正在使用Spring Boot 1.2.5 我使用的是Spring Actuator和Spring Remote Shell,它们已经从类路径中删除,认为它们可能会引起问题 我排除了SecurityAutoConfigsion,因为它可能会导致我的问题 这是我的主要课程 这是我的安全配置 我的问题/问题是 > C

  • Spring Boot允许您创建后台“类似cron”的任务,如下所示: 这使得自动集成测试有点困难!我不应该让一个正在运行的集成测试挂起一个小时,等着看当我的任务在一个小时内运行时会发生什么。我也不应该等到临近小时时才运行测试,这样我就可以在最忙的时候确认正确的行为! 有没有办法使这些cron值可配置?这样,如果我想在“测试模式”下运行我的应用程序,我可以安排方法运行,比如说,每30秒运行一次,等

  • 我的目标是运行ECS容器之间的8AP-5PM仅!

  • 问题内容: 我能够在applicationContext.xml中创建taskScheduler,并且根据该属性定期触发我的工作。 我想在调度程序启动后更改此表达式(触发时间),这意味着JavaEE应用程序正在运行。 使用Spring 3.XX 问题答案: 其实我也遇到过同样的问题 我假设您需要从用户那里获取date(1-31),时间,星期几,调度程序的类型(每日,每月,每周)。 首先,您需要根据

  • 我目前遇到一个问题,而使用@调度(cron)注释在Spring。 此任务每天凌晨3点(周一至周五)执行: 03:00:00278-03:00:08269 03:00:08269-03:00:15451 我的问题是,为什么这个任务执行两次?我已经说过,它应该只在分钟“0”和“0”秒运行,但这似乎是错的(请参阅执行时间)。我有两个这样的任务,都有这个问题。有没有人知道发生这种情况的原因以及如何避免?

  • 我试图理解异步是如何工作的,但有一种情况我已经简化到了极致,我找不到任何解释。 在项目上mvc ASP.NET framework 4.6: 当我执行上面的代码时: 从未验证过。DoWork()运行在另一个线程上,而不是我的主线程上。对我来说,这是正常的,这是我在阅读过程中一直明白的。 但如果我在任务上放一个等待。快跑 有时它是另一个线程而不是主要的,有时它不是,我不明白。 这里写着: 运行在线程

  • 似乎HttpClient/HttpClientHandler没有提供忽略不信任证书的选项,比如WebRequest使您能够忽略不信任证书(尽管使用)。 任何帮助都将不胜感激!