Spring Framework под высокой нагрузкой с методами @Async

Я создаю высокодоступное и масштабируемое веб-приложение. Он также выдержит довольно значительную нагрузку.

Вопрос в том, как методы @Async работают в Spring Framework?

Я планирую использовать метод use@Async для ведения журнала (отправлять журналы на какой-либо внешний сервер ведения журнала). И интересно, как поведет себя система, если много потоков (т.е. пользователей) начнут вызывать эти методы?

Насколько я понимаю, Spring берет предварительно созданные потоки от исполнителя потока. Но что произойдет, если есть только 3 потока, но 1000 одновременных пользователей?

Будет ли метод @Async заблокирован, если какой-то поток не станет доступным и не начнет выполнять задание? Или «задание» будет помещено в очередь, а основной поток продолжит работу, как и ожидалось?

Любая помощь будет высоко оценена.


person user3489820    schedule 15.09.2014    source источник


Ответы (1)


Документация @Async может быть найдено здесь.

Короче говоря, чтобы заставить @Async работать, вам нужно объявить Executor. Этот Executor будет отвечать за выполнение вашего @Async аннотированного метода.

В типичном приложении вы должны объявить пул потоков с поддержкой Executor.

Когда вы вызываете свой метод @Async, прокси-сервер перехватывает вызов, создает Runnable (или Callable) и отправляет его в Executor. Затем он вернется немедленно. Таким образом, вызов метода @Async никогда не блокируется.

Однако, если у вашего Executor нет доступных потоков, т.е. все они заняты выполнением других отправленных задач, задача @Async, которую вы отправили, останется в очереди, пока поток не станет доступным.

person Sotirios Delimanolis    schedule 15.09.2014