Часть вашего вопроса о Spring MVC довольно проста, поскольку проблема не имеет ничего общего с Spring MVC.Смотрите возможное решение в этом ответе: https://stackoverflow.com/a/4427922/734687
Как вы можете видеть в коде, автор использует tokenService для хранения будущего.Реализация не включена, и здесь начинаются проблемы, как вы уже знаете, когда вы хотите переключиться на другой ресурс.
- Невозможно сериализовать будущее и позволить ему перейти на второй экземпляр сервера.Поток выполняется в определенном экземпляре и поэтому должен оставаться там.Таким образом, хранение сессии не вариант.
- Как и в примере ссылки, вы можете использовать сервис токенов.Обычно это просто HashMap, где вы можете сохранить свой объект и получить к нему доступ позже через токен (идентификатор String).Но, опять же, это работает только в том же веб-приложении, когда tokenService является одноэлементным.
Решение состоит не в том, чтобы сохранить будущее, а в состоянии работы (в работе, готово,не удалось с результатом).Даже когда сеанс запроса и исполняющие потоки находятся на разных машинах, состояние должно быть доступно и доступно для сериализации.Но как бы вы это сделали?Это может быть реализовано путем сохранения его в базе данных или в файловой системе (в приведенном выше примере вы можете проверить, доступен ли файл zip), или в хранилище ключей / значений, или в кэше, или в хранилище общих объектов (Terracota)...
Фактически, каждый пакетный фреймворк (например, Spring Batch) работает таким образом.Он хранит текущее состояние заданий в базе данных.Вы обеспокоены тем, что вы смешиваете данные домена с рабочими данными.Но большинство приложений делают.В больших приложениях есть возможность использовать два экземпляра базы данных, рабочие данные и данные домена.
Поэтому я рекомендую сохранить состояние и результат работы в базе данных.
Надеюсь, это поможет.