Как правильно добавить EventListener в AtmosphereResource?

Я использую Atmosphere Framework 2.0.8.

Я реализовал AtmosphereHandler в своем приложении, и у меня правильно происходит двусторонняя связь через WebSockets и Long Polling.

Я пытаюсь добавить некоторый код обработки, когда клиент отключается, чтобы очистить некоторые ресурсы, специфичные для этого клиента (т.е. у меня есть запись в таблице, которую я хочу удалить).

Я прочитал следующие записи в вики:

Уловки OnDisconnect: https://github.com/Atmosphere/atmosphere/wiki/onDisconnect-tricks Настройка прослушивателя атмосферы: https://github.com/Atmosphere/atmosphere/wiki/Configuring-Atmosphere-Listener

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

atmosphereResource.addEventListener( new AtmosphereResourceEventListenerAdapter() {} );

В конце концов я нашел пример кода в JavaDoc для AtmosphereHandler, который регистрирует EventListener в методе onRequest(). http://atmosphere.github.io/atmosphere/apidocs/org/atmosphere/cpr/AtmosphereHandler.html

Я хотел бы знать, является ли это правильным способом сделать это?

Насколько я понимаю, AtmosphereResource представляет собой соединение между клиентом и сервером на весь срок существования этого соединения. UUID остается согласованным для объекта при нескольких вызовах метода onRequest() от одного и того же клиента. Таким образом, один и тот же объект AtmosphereResource будет добавлять EventListener каждый раз, когда вызывается метод onRequest.

Это кажется неправильным. Не приведет ли это к тому, что для каждого AtmosphereResource будут зарегистрированы тысячи EventListeners?

Кажется, что EventLister должен быть зарегистрирован только один раз для каждого AtmosphereResource.

Я чувствую, что мне здесь не хватает чего-то фундаментального. Может кто-нибудь объяснить?


person James Xabregas    schedule 08.06.2014    source источник


Ответы (1)


Вот ссылка пример с использованием MeteorServlet, так что это не будет выглядеть точно так, как вам нужно будет сделать, но это должно помочь вам начать. Я добавляю прослушиватель к экземпляру Meteor, а вы добавляете свой к экземпляру AtmosphereResource. Каждый ресурс получает только одного слушателя.

Переопределенный метод onDisconnect() вызывает метод службы Grails, обрабатывающий событие. Конечно, вы захотите вызвать что-то, что очищает ресурсы вашей базы данных.

Обратите внимание, что сервлет настроен с использованием эти параметры. Я думаю, вам может понадобиться org.atmosphere.interceptor.HeartbeatInterceptor, но я так давно не устанавливал его, что не могу вспомнить, нужен ли он.

person Ken    schedule 08.06.2014