Управление количеством выполнений потоков в Spring Async Task Executor для определенного метода - PullRequest
0 голосов
/ 15 мая 2018

Я использую задачу Spring Async в своем приложении, и у меня есть проблема с задачей, которая требует всех ресурсов сервера. В частности у меня такая конфигурация:

@Override
public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(100);
    executor.initialize();
    return executor;
} 

И я использую задачу aync для трех методов, два очень простые и быстрые, но один сложный, потому что он создает процесс, в котором процедура Matlab занимает от нескольких секунд до нескольких минут и требует огромное количество ресурсов. Так что только для этой задачи я хотел бы иметь один поток и поставить в очередь все остальные запросы для последовательного выполнения.
С вышеупомянутой конфигурацией я управляю всеми потоками моего приложения, есть ли способ ограничить только определенный метод Async? Если это невозможно, лучшим решением может быть использование семафора или ExecutorServices ?

1 Ответ

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

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

@Bean(name= "myExecutor")
public Executor getCustomAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(100);
    executor.initialize();
    return executor;
} 

И установите его для своего асинхронного метода:

@Async("myExecutor")
...