Spring предоставляет лишь удобную обертку, сам механизм построен на servlet 3.0 (не знаю используете ли вы его, можете почитать тут http://www.javacodegeeks.com/2013/08/async-servlet-feature-of-servlet-3.html).
В нашем проекте используется асинхронная доставка сообщений приходящих через jms, есть один jms лисенер получающий сообщения (допустим - userId, messageBody) и кладущий их в контейнер держущий deferedResult-ы от активных long-polling запросов (там же проставляется result и объект удаляется из структуры). Без спринга - вариант реализации - использование блокирующей очереди, напр. PriorityBlockingQueue poll() с указанием таймаута на получение (не советую ставить выше 60сек - стандартный http таймаут, мы обычно ставим 50).
Subscriber для каждого пользователя в каком то виде всё равно придется иметь, вам же нужен какой то способ выплюнуть куда то ответ с сервера