Реализация Spring TaskExecutor - PullRequest
0 голосов
/ 22 мая 2018

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

Я использую TaskExecutor из Spring, который является эквивалентом JDK 1.5Executor.

Я реализовал это следующим образом:

У меня есть Java-интерфейс, содержащий 1 метод:

    public interface AsynchronousService {
    void executeAsynchronously(Runnable task);
}

и соответствующую реализацию:

    public class AsynchronousServiceImpl implements AsynchronousService {

    private TaskExecutor taskExecutor;

    @Override
    public void executeAsynchronously(Runnable task) {
        taskExecutor.execute(task);
    }

    @Required
    public void setTaskExecutor(TaskExecutor taskExecutor) {
        this.taskExecutor = taskExecutor;
    }
}

Вот конфигурация TaskExecutor.Я не уверен в этой конфигурации.Поскольку я хочу, чтобы уведомления выполнялись последовательно, я установил 1 для corePoolSize и maxPoolSize.Это означает, что только один поток будет создан в пуле потоков и будет извлекать уведомления последовательно из очереди.Я также установил «false» для «WaitForTasksToCompleteOnShutdown», чтобы не завершать работу после выполнения каждой задачи, а вместо этого, когда контекст весны разрушается.Я в целом прав с моими предположениями?

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="1"/>
    <property name="maxPoolSize" value="1"/>
    <property name="WaitForTasksToCompleteOnShutdown" value="false"/>
</bean>

Здесь я выполняю затем код:

 asynchronousService.executeAsynchronously(new Runnable() {
     @Override
     public void run() {
         someMethod.processNotification(notification)
      }
   });

Что вы думаете о моей реализации?Я что-то пропустил?Я не уверен, если / где мне нужно реализовать некоторую обработку ошибок?

РЕДАКТИРОВАТЬ: есть ли возможность весной настроить реализацию исполнителя задач для использования пользовательской очереди?Или насколько сложно расставить приоритеты для задач в очереди?Я посмотрел на некоторые реализации, но большинство из них реализуют executor-сервис из sratch без использования Spring.

1 Ответ

0 голосов
/ 22 мая 2018

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

Если вы обрабатываете последовательно, вы не делаетевсе равно нужен пул потоков.

Поскольку я хочу, чтобы уведомления выполнялись последовательно, я установил 1 для обоих, corePoolSize и maxPoolSize

Это создаст фиксированный размер пула 1. Есть только одинпоток, поэтому он будет выполняться последовательно

Я также установил «false» для «WaitForTasksToCompleteOnShutdown», чтобы не завершать работу после выполнения каждой задачи, а вместо этого, когда контекст пружины разрушается

Это неправильно.Этот флаг говорит пулу ждать завершения задачи при завершении работы (например, если вы вызываете pool.shutdownNow(), пул будет ожидать выполнения любых потоков)

И подведем итог: не используйте пул потоков, если хотитевыполнять последовательно по одному без одновременного

...