Создание задач и их обработка

179
09 января 2019, 10:20

Необходимо организовать рассылку почты следующим образом. Предположительно что модуль рассылки является частью существующего приложения. Необходимо разработать объект-поставщик, который будет создавать задания на рассылку почты, и объект-потребитель, который будет брать задания на рассылку почты из очереди и выполнять их.

Что требуется на выходе. небольшая имитация процесса создания и обработки задач. Т.е. через случайное время создаются задания на рассылку, а потребитель их периодически обрабатывает.

Что уже реализовано:

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. Но я не совсем понимаю, как в эти задачи добавить какие нибудь объекты ( письмо ). Конкретно письмо получать не нужно. Можно просто создать подобие, заглушку. Далее мне нужно Вытаскивать эти письма по очереди и выполнить имитацию отправки, просто вывести в консоль.

Прошу помочь в данном вопросе. Было бы отлично показать какой нибудь пример. Спасибо.

Answer 1

Чтобы передать что-то в 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();
    }
  }
}
READ ALSO
Crash в Crashlytics

Crash в Crashlytics

Почему при старте виджета с интегрированным Firebase Crashlytics выпадает это?

215
Регулярные выражения и перевод строки в Java

Регулярные выражения и перевод строки в Java

Задача извлечь то, что находится на месте "body" между "begin" и "end" в приведенном ниже коде, но никак не могу понять как составить регулярное выражение,...

205
Что значит строка int guess = -1?

Что значит строка int guess = -1?

Вот мой код, взял с одной книги:

183