Необходимо организовать рассылку почты следующим образом. Предположительно что модуль рассылки является частью существующего приложения. Необходимо разработать объект-поставщик, который будет создавать задания на рассылку почты, и объект-потребитель, который будет брать задания на рассылку почты из очереди и выполнять их.
Что требуется на выходе. небольшая имитация процесса создания и обработки задач. Т.е. через случайное время создаются задания на рассылку, а потребитель их периодически обрабатывает.
Что уже реализовано:
public void creatorTask(){
ExecutorService executor = Executors.newWorkStealingPool();
List<Callable<String>> callables = Arrays.asList(
() -> "task1",
() -> "task2",
() -> "task3");
try {
executor.invokeAll(callables)
.stream()
.map(future -> {
try {
return future.get();
}
catch (Exception e) {
throw new IllegalStateException(e);
}
})
.forEach(System.out::println);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Я создаю задачи, далее их обрабатываю методом invokeAll. Но я не совсем понимаю, как в эти задачи добавить какие нибудь объекты ( письмо ). Конкретно письмо получать не нужно. Можно просто создать подобие, заглушку. Далее мне нужно Вытаскивать эти письма по очереди и выполнить имитацию отправки, просто вывести в консоль.
Прошу помочь в данном вопросе. Было бы отлично показать какой нибудь пример. Спасибо.
Чтобы передать что-то в Callable, имплементируй Callable и передай, например, сразу в конструкторе.
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class App {
public static void main(String[] args) {
creatorTask();
}
public static void creatorTask() {
ExecutorService executor = Executors.newWorkStealingPool();
List<SendMailTask> sendMailTasks = Arrays.asList(
new SendMailTask(new Mail("mail1")),
new SendMailTask(new Mail("mail2")),
new SendMailTask(new Mail("mail3")));
try {
executor.invokeAll(sendMailTasks)
.stream()
.map(future -> {
try {
return future.get();
} catch (Exception e) {
throw new IllegalStateException(e);
}
})
.forEach(System.out::println);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static class Mail {
String content;
public Mail(String content) {
this.content = content;
}
}
private static class MailSendResult {
}
private static class SendMailTask implements Callable<MailSendResult> {
private Mail mail;
public SendMailTask(Mail mail) {
this.mail = mail;
}
@Override
public MailSendResult call() throws Exception {
System.out.println(mail.content);
return new MailSendResult();
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Почему при старте виджета с интегрированным Firebase Crashlytics выпадает это?
Задача извлечь то, что находится на месте "body" между "begin" и "end" в приведенном ниже коде, но никак не могу понять как составить регулярное выражение,...