使用注解@scheduled的cron动态地调度一个方法

yws3nbqq  于 2021-07-15  发布在  Java
关注(0)|答案(2)|浏览(301)

我想使用注解@scheduled using 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();
        }

    }
bttbmeg0

bttbmeg01#

所以我在考虑下一个解决方案使用此处接受的答案)
假设您有一个类imlpements runnable interface->这将是您执行的作业。我们就叫它吧 MyJob 同时假设我们有一张Map id 以及它的执行引用(稍后您将看到我所说的内容)。可以这样说 currentExecutingJobs 假设您有一个从客户机获取作业名称和cron表达式的端点
当端点被调用时:
您将在上面的Map中查看是否有具有该作业id的条目。如果存在,则取消该作业。
之后,您将创建该作业的一个示例(您可以通过使用反射和在作业类上有一个自定义注解来完成这项工作,您可以在其中提供一个id @MyJob("myCustomJobId" )
在提供的链接中,您将使用

// Schedule a task with the given cron expression
 ScheduledFuture myJobScheduledFutere = executor.schedule(myJob, new CronTrigger(cronExpression));

把结果放在上面的Map上 currentExecutingJobs.put("myCustomJobId", myJobScheduledFutere) 计划未来文档

ovfsdjhp

ovfsdjhp2#

如果要从数据库中读取属性,可以实现environmentpostprocessor并从db中读取必要的值,然后将其添加到environment对象中,更多详细信息请参见https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-Spring启动应用

相关问题