当前位置: 首页 > 知识库问答 >
问题:

在spring boot中使用@Scheduled annotation调度函数

锺离鸿
2023-03-14

我想在我的角度表上指定的日期和时间执行以下方法-以下是输入:

<input required [(ngModel)]="emailNotification.sendingDate" class="form-control" type="datetime-local" name="sendingDate" id="time">

发送电子邮件的方法(来自控制器)

@PostMapping(value="/getdetails")
    public @ResponseBody void sendMail(@RequestBody EmailNotification details) throws Exception {
        try {
            JavaMailSenderImpl jms = (JavaMailSenderImpl) sender;
            MimeMessage message = jms.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());

            
            helper.setFrom("smsender4@gmail.com");
            List<String> recipients = fileRepo.findWantedEmails(details.getDaysNum());
            String[] to = recipients.stream().toArray(String[]::new);
            helper.setTo(to);
            helper.setText(details.getMessage(),true);
            helper.setSubject("Test Mail");
            details.setRecipients(to);
            sender.send(message);
            enr.save(new EmailNotification(details.getId(), "Test mail", details.getMessage(), details.getDaysNum(), details.getRecipients(), details.getSendingDate()));
        } catch (MessagingException e) {
            throw new RuntimeException("fail to send emails: " + e.getMessage());
        }
       

电子邮件otification.class

public class EmailNotification {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String subject;
    private String message;
    private int daysNum;
    private String[] recipients;
    /*
     * @Temporal(TemporalType.TIMESTAMP)
     */ 
    //"yyyy-MM-dd'T'HH:mm:ss.SSSX"
    @Column(name = "sending_date")
    @Basic(fetch = FetchType.EAGER)
    private LocalDateTime sendingDate;

    public EmailNotification(long id, String subject,String message, int daysNum, String[] recipients, LocalDateTime sendingDate) {
        super();
        this.sendingDate = sendingDate;
        this.daysNum = daysNum;
        this.id = id;
        this.message = message;
        this.subject = subject;
    }
    
    

我不知道该怎么做,如果有人帮忙,我会很感激的

共有1个答案

高恺
2023-03-14

现在我想我明白了你想要实现的目标,所以检查一下这是否对你有效。

假设你想在给定的表格中发送电子邮件(我将命名为PAYMENT),截止日期还有5天。假设这个表有一个名为Payment的等效实体类,您可以这样做:

  1. 如果支付实体有自己的CRUDEPository扩展,您可以使用它访问dabatase,您可以进行查询,查找接近截止日期的付款。这当然取决于您访问数据库的方式。下一个示例查询可能不起作用(因为据我所知,JPA不支持DATEDIFF),但将作为您试图实现的目标的基础
@Repository
public interface PaymentRepository extends CrudRepository<Payment, Integer> {

    /* You need to find every payment that's 5 days from the deadline */
    @Query("SELECT p FROM PAYMENT p WHERE DATEDIFF(day, CURRENT_TIMESTAMP, p.deadline) <= 5")
    public List<PaymentRepository> findPaymentsCloseToDeadline();
    
}
@Configuration
@EnableScheduling
public class EmailScheduler {

    @Autowired
    private PaymentRepository paymentRepository;

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

        // Here you are accessing the payments close to the deadline
        List<Payment> payments = paymentRepository.findPaymentsCloseToDeadline();

        /* Send an email for each payment. Use the database info you already have to fill the information */
        for (Payment payment : payments) {
            try {
                helper.setFrom("smsender4@gmail.com");
                // Fill the recipients with the info you need
                String[] recipients = {payment.getUserEmail(), "other@email.com"};
                helper.setTo(recipients);
                String msg = "Here would go the message";
                helper.setText(msg, true);
                helper.setSubject("Test Mail");
                sender.send(message);
                // You would still need to calculate the ID and the days if you require them
                enr.save(new EmailNotification(id, "Test mail", msg, days,
                        recipients, "today's date in LocalDate"));
            } catch (MessagingException e) {
                throw new RuntimeException("fail to send emails: " + e.getMessage());
            }
        }
    }

}

这只是一个指南,因为关于你的代码,我仍然有一些不知道的地方,但我希望它足够清晰,这样对你有帮助。祝你好运

 类似资料:
  • 问题内容: 我在redux存储中有一个Cart数组,其中包含我添加到购物车中的所有项目 像这样 并且我有一个输入来添加优惠券代码,当我添加优惠券代码会降低总价,所以如果我没有在商店中存储总计,该如何实现?并在添加此优惠券后渲染总价! 这是我的代码片段 reducer / index.js 购物车屏幕 问题答案: 我的建议是不要在状态中存储冗余(派生的)信息。这意味着您不需要(也不应该!)将总数存储

  • 我的ts文件中有一个函数: 我想要的是在我的HTML中返回这个函数的结果。我可以调用html中的函数,如: 但每次单击任何位置时,它都会更改值,而我会得到一个错误:

  • 问题内容: 我已经为此苦苦挣扎了几个小时,即使在阅读了Stack上的几个示例后,我也无法使它正常工作。我是JS新手,这无济于事。 我正在尝试从Google Geocoder API检索有关地址的信息,然后将该对象传递给另一个函数。根据我的阅读,我了解到我用来检索信息的函数是异步的,因此我需要使用一个回调函数来读取它。但是,当我尝试执行此操作时,控制台仍然返回“ undefined”。我知道该信息来

  • 使用的技术: Spring Boot 1.4.2.Release,Spring 4.3.4.Release,Tymeleaf 2.1.5.Release,Tomcat Embeded 8.5.6、Maven 3、Java 8 我创建了这个服务来发送电子邮件

  • 问题内容: 注意:这旨在作为常见问题的规范答案。 我有一个带有字段()的Spring 类(),但是该字段是我尝试使用它时所用的。日志显示同时创建了bean和bean,但是每当尝试在服务bean上调用方法时,我都会得到一个。Spring为什么不自动接线该领域? 控制器类: 服务等级: 应该自动连接的服务bean,但不是: 当我尝试时,出现以下异常: 问题答案: 带注释的字段是因为Spring不知道您