如何根据特定标准使用任务调度程序

kb5ga3dv  于 2022-09-19  发布在  Spring
关注(0)|答案(1)|浏览(187)

我正在写一个关于SpringBoot的项目。
现在,我有了一个用户的电子邮件地址列表,我可以向其发送一封信。大约1000个地址。
由于SMTP对每小时可以发送的电子邮件数量有限制,我只想每小时发送99封电子邮件。接下来的99个小时,以此类推,直到信件被发送到列表中的所有地址。
如何使用任务调度程序执行此操作?它应该在控制器的POST方法被调用后运行。如果你分享代码,我会很高兴。
现在,我正在使用循环和Thread.sleep

int counter = 0;
    long startTime = System.currentTimeMillis();
    for (String emailAddress : usersEmailAddresses) {
        counter++;
        bulkEmailService.send(BulkEmailMessage.builder()
                .from(bulkEmailMessage.getFrom())
                .subject(bulkEmailMessage.getSubject())
                .content(bulkEmailMessage.getContent())
                .toAddresses(emailAddress)
                .build());

        if (counter % 99 == 0) {
            long endTime =  System.currentTimeMillis() - startTime;
            Thread.sleep(1000 * 60 * 60 - endTime);
            startTime = System.currentTimeMillis();
        }
    }

谢谢

4xrmg8kj

4xrmg8kj1#

实现这一点最简单的解决方案是使用cron作业。
要做的第一件事是在应用程序文件或配置中添加@EnableScheduling。然后,您可以在方法上方添加@Scheduled(cron = "0 0 * * * *"),以每小时运行一次。(cron代码意味着每次服务器达到分钟0和秒0时运行代码。)
对于此解决方案,您将在数据库中以last_send_id列保存广播电子邮件。我假设电子邮件列表的ID从1到电子邮件列表的总大小。每次广播电子邮件达到1000,它都会在数据库中接收下一封电子邮件,并从头开始运行。

@Scheduled(cron = "0 0 * * * *")
public void sendEmail(){
    int counter = 0;
    List<User> userList = userRepository.findAll();
    List<Email> emailList = emailRepository.findAllByLastSendIdLessThan(userList.size());
    for (Email email: emailList){
        for (int i = email.getLastSendId(); i< = userList.size(); i++){
            counter++;

            bulkEmailService.send(BulkEmailMessage.builder()
                .from(email.getFrom())
                .subject(email.getSubject())
                .content(email.getContent())
                .toAddresses(userList[i].getEmailAddress())
                .build());

            email.setLastSendId(i);
            emailRepository.save(email);

            if (counter % 99 == 0) {
                break;
            }
        }
    }
}

相关问题