Вы можете использовать ScheduledExecutorService
для обработки этого в "простой" Java:
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
int count = 0;
Runnable task = () -> {
count++;
System.out.println(count);
};
ScheduledFuture<?> scheduledFuture = ses.scheduleAtFixedRate(task, 12, TimeUnit.HOURS);
Существует также метод для использования начальной задержки, но вы можете прочитать больше здесь: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html
Для вашего случая использования:
Введите новый класс EmailSendJobUtil
:
public class EmailSendUtil {
public void createAndSubmitSheduledJob() {
ScheduledExecutorService ses = Executors.sheduledThreadPool(1);
ScheduledFuture<> sheduledFuture = ses.sheduleAtFixedRate(EmailUtility.sendMail(), 12, TimeUnit.HOURS);
}
}
Однако у вас будут проблемы с вашей структурой кода.Попробуйте ввести в свой EmailUtility
метод, который включает в себя автоматическую отправку писем.
Представьте репозиторий для сохранения пользователей, которым вы должны автоматически отправлять письма, и прочитайте эти данные в новом методе, который обрабатывает только автоматическую отправку.Вы можете сделать что-то вроде этого:
public class MailJobRepository {
private List<MailJob> jobs;
void add();
void remove();
List<> getJobs();
}
И в вашем EmailUtility
ввести новый метод:
public void sendAutomatedEmails() {
jobRepository.getJobs().foreach(job -> {
sendMail(job.getToAddress(), job.getSubject(), job.getMessage());
});
}
Затем вы можете запланировать этот новый метод и разбить свой код налогические отдельные части.
Небольшая подсказка:
String host, String port, final String userName, final String password
Это данные для вашей "стороны" отправки электронной почты, которые не должны передаваться в качестве параметра метода.Вы можете сохранить эти данные в своем EmailUtility
классе.