Отслеживание состояния нескольких асинхронных запросов при использовании Spring @Async

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

У меня есть сценарий, в котором запрос, отправленный на серверную часть, займет некоторое время.

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

Я вижу, что Spring предоставляет аннотацию @Async, которую можно использовать для создания отдельного потока обработки из основного потока, и с помощью этого я могу разгрузить обработку в отдельном потоке.

Что я хочу сделать, так это когда я возвращаю первоначальный ответ как принятый, я также хочу предоставить клиенту ключ/токен отслеживания, который клиент может позже использовать для проверки статуса запроса.

Поскольку может быть несколько клиентов, которые будут обращаться к службе, должен быть способ однозначно идентифицировать запрос каждого клиента от другого.

Я вижу, что в Spring Async или Future нет такой функции, которая может возвращать идентификатор отслеживания как таковой.

Одна из возможностей, которую я вижу, это вернуть Future в HttpSession, а затем использовать его для проверки статуса клиентом. Но я предпочитаю не использовать HttpSession и хочу, чтобы мои службы не сохраняли состояние.

Есть ли способ/подход, которым я могу выполнить свое требование.

Спасибо,

BS


person hello user    schedule 02.07.2016    source источник


Ответы (1)


Создайте ключ перед вызовом метода Async и передайте его методу:

String key = generateUniqueKey();
callAsyncMethod(key);
return key;

Метод Async должен где-то сохранять статус выполнения (назовем его dataStore). Когда клиент запрашивает статус с помощью ключа, вы ищете его в хранилище данных и возвращаете.

person Ruben    schedule 03.07.2016