通常使用注释@Scheduled的cron来调度一个方法



我想使用注释@Scheduled使用cron来调度一个方法,例如,我希望该方法应该每天在客户端指定的时间内执行。因此,我想从DB中获得cron值,以便让客户端可以随时执行该方法。这是我的方法,它在上午10:00自动向给定的地址发送电子邮件,所以我的目标是使10:00动态。谢谢你的帮助。


@Scheduled(cron = "0 00 10* * ?")
public void periodicNotification()  {
JavaMailSenderImpl jms = (JavaMailSenderImpl) sender;
MimeMessage message = jms.createMimeMessage();
MimeMessageHelper helper;
try {
helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());


List<EmailNotification> emailNotifs = enr.findAll();
for (EmailNotification i : emailNotifs) 
{
helper.setFrom("smsender4@gmail.com");
List<String> recipients = fileRepo.findWantedEmails(i.getDaysNum());
//List<String> emails = recipientsRepository.getScheduledEmails();
String[] to = recipients.stream().toArray(String[]::new);
helper.setTo(to);
helper.setText(i.getMessage());
helper.setSubject(i.getSubject());
sender.send(message);
System.out.println("Email successfully sent to: " + Arrays.toString(to));
}
}
catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

所以我在考虑下一个解决方案。(+使用此处接受的答案(

  1. 假设您有一个类,它支持Runnable接口->这将是你的工作得到执行。我们称之为MyJob

  2. 还假设我们有一个映射,其中包含作业的id及其执行引用(稍后您将看到我在说什么(。称之为currentExecutingJobs

  3. 假设您有一个从客户端获取作业名称和cron表达式的端点

  4. 当调用端点时:

  5. 您将在上面的地图中查看是否有带有该作业id的条目。如果存在,则取消该作业。

  6. 之后,您将创建该作业的一个实例(您可以通过使用反射并在作业类上有一个自定义注释来实现这一点,您可以在其中提供id。例如@MyJob("myCustomJobId"(

  7. 从提供的链接中,您将使用安排作业

    // Schedule a task with the given cron expression
    ScheduledFuture myJobScheduledFutere = executor.schedule(myJob, new CronTrigger(cronExpression));
    
  8. 并将结果放在上面的映射currentExecutingJobs.put("myCustomJobId", myJobScheduledFutere)

ScheduledFuture文档

如果您想从数据库中读取属性,可以实现EnvironmentPostProcessor,从DB中读取必要的值并将其添加到Environment对象中,更多详细信息请访问https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-弹簧引导应用

最新更新