Я пишу веб-приложение, которое позволяет людям сотрудничать.Я бы хотел, чтобы некоторые из моих сервисов работали для совместной работы (в которой участвуют несколько человек), а не для какой-либо отдельной http-сессии.Я создал пользовательский Scope
, в котором хранятся бобы.Чтобы управлять жизненным циклом компонента, я отслеживаю идентификаторы сеансов, связанные следующим образом:
protected ConcurrentMap<String,Object> attributes =
new ConcurrentHashMap<String, Object>();
...
@Override
public Object get(String name, ObjectFactory<?> factory) {
synchronized(this.attributes) {
Object scopedObject = this.attributes.get(name);
if (scopedObject == null) {
scopedObject = factory.getObject();
this.attributes.put(name, scopedObject);
RequestAttributes reqAttrs = RequestContextHolder.currentRequestAttributes();
activeSession(name).add(reqAttrs.getSessionId());
}
return scopedObject;
}
}
Когда сеанс закрывается, я хотел бы удалить идентификатор сеанса из списка активных сеансов, связанных с данным компонентом.название.Когда набор становится пустым, я могу очистить.
Самый простой способ, которым я могу думать о закрытии сеанса управления, - это HttpSessionListener
, но у меня есть разрыв между моим Scope
и слушателем.Я вижу следующие возможности:
Я могу создать HttpSessionListener
статически, принять единственный экземпляр, заставить его управлять списком подписок, и мои экземпляры Scope
подписываются на его события,Но это кажется избыточным, и мне не нравится шаблон синглтона для этого.
Если бы у меня был доступ к HttpSession
в Scope
, я мог бы добавить Scope
в список, сохраненный в сеансе, и попросите слушателя уведомить членов этого списка, что сеанс уходит.Но я не понимаю, как получить объект сеанса (а не только его идентификатор) в экземпляре Scope
.
Я могу заставить свой Scope
реализоватьHttpSessionListener
интерфейс и тем самым обновлять его состояние напрямую, но я не знаю, как программно зарегистрировать слушателя.Есть ли публичный способ сделать это?
Есть ли лучший способ?
Спасибо за вашу помощь,
гена