Как использовать ScheduledExecutorService для периодического запуска задания с несколькими службами

Я пытаюсь выполнять задание по электронной почте каждую минуту. Работа имеет 5 услуг. Каждые 5 сервисов должны работать параллельно.

Использование ExecutorService:

ExecutorService service = null;
if (serviceMap != null && serviceMap.size() > 0) {

    for (;;) {
        service = Executors.newFixedThreadPool(serviceMap.size());  // Here Service Map size will be 5
        for (Map.Entry entry : serviceMap.entrySet()) {
            service.submit(new EmailService(conn, mailParam));
        }
        service.shutdown();
        service.awaitTermination(1, TimeUnit.MINUTES);
    }
}

Использование ScheduledExecutorService :

ScheduledExecutorService scheduledExecutorService = null;
if (serviceMap != null && serviceMap.size() > 0) {
    scheduledExecutorService = Executors.newFixedThreadPool(serviceMap.size());  // Here Service Map size will be 5
    for (Map.Entry entry : serviceMap.entrySet()) {

        ScheduledFuture scheduledFuture =
                scheduledExecutorService.schedule(new EmailService(conn, mailParam),
                60,
                TimeUnit.SECONDS);
        System.out.println("result = " + scheduledFuture.get());
    }

    scheduledExecutorService.shutdown();
}

Если я использую ExecutorService, каждую минуту я отключаю службу и снова запускаю службу. Все в порядке?

Если я использую ScheduledExecutorService, я не смогу написать код для параллельного выполнения службы и не смогу запускать задание каждую минуту.

Выше мой фрагмент кода. Пожалуйста, помогите мне решить эту проблему.


person deadend    schedule 27.02.2017    source источник
comment
Возможный дубликат Как реализовать ExecutorService выполнять задачи на ротационной основе?   -  person Adonis    schedule 27.02.2017
comment
Они не используют ScheduledExecutorService для периодического запуска.   -  person deadend    schedule 27.02.2017


Ответы (2)


Прежде всего, вы должны вызвать newScheduledThreadPool(), который создает ScheduledExecutorService, который является правильной службой исполнителя планирования.
Затем вы должны использовать метод [scheduleAtFixedRate][1] для планирования задачи каждую минуту с начальной задержкой 60 секунд.

ScheduledExecutorService scheduledExecutorService = null;
if (serviceMap != null && serviceMap.size() > 0) {
    scheduledExecutorService = Executors.newScheduledThreadPool(serviceMap.size());  // Here Service Map size will be 5
    for (Map.Entry entry : serviceMap.entrySet()) {
        scheduledExecutorService.scheduleAtFixedRate(new EmailService(conn, mailParam),
                60,
                60,
                TimeUnit.SECONDS);
    }
}
person lapaczo    schedule 27.02.2017
comment
scheduleAtFixedRate спрашивает Runnable как параметр, но я хочу, чтобы Callable был параметром. - person deadend; 28.02.2017
comment
Вместо этого вы можете использовать RunnableFuture. Но в итоге вы получите 5 ScheduledFuture. Лучше было бы использовать обратные вызовы. - person lapaczo; 28.02.2017
comment
Ок Оля Спасибо. Поскольку он многопоточный, нужно ли для каждого потока отдельное соединение? - person deadend; 28.02.2017
comment
EmailService запустит 5 наборов сервисов. Внутри класса EmailService я написал ExecutorService с [Executors.newFixedThreadPool(5)] - person deadend; 28.02.2017

Хороший вопрос !!

Вы должны разделить его на два класса.

Один из них — запустить планировщик. Другой для выполнения службы, которая реализует интерфейс Callable или Runnable.

запланированныйExecutorService.schedule() отличается от service.submit().

schedule() используется для планирования процесса, тогда как submit используется для отправки услуг.

Запустить класс планировщика:

public static void main(String[] args) {
        Class2 runnable = new Class2() {
          @Override
          public void run() {
            // call method that has ExecuteService Impl
          }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS);
  }
person Community    schedule 27.02.2017