将EventListener添加到AtmosphereResource的正确方法是什么?

时间:2014-06-08 12:47:21

标签: atmosphere

我正在使用Atmosphere Framework 2.0.8。

我已在我的应用程序中实现了AtmosphereHandler,并通过WebSockets和Long Polling正确地进行了双向通信。

我正在尝试添加一些处理代码,以便在客户端断开连接以清理特定于该客户端的某些资源时(例如,我在要移除的表中有一个条目)。

我已阅读以下维基条目:

OnDisconnect技巧:https://github.com/Atmosphere/atmosphere/wiki/onDisconnect-tricks 配置Atmosphere Listener:https://github.com/Atmosphere/atmosphere/wiki/Configuring-Atmosphere-Listener

我不清楚的是我应该将呼叫添加到

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

我最终在JavaDoc中为AtmosphereHandler找到了一些示例代码,它在onRequest()方法中注册了EventListener。 http://atmosphere.github.io/atmosphere/apidocs/org/atmosphere/cpr/AtmosphereHandler.html

我想知道的是,这是正确的方法吗?

据我了解,AtmosphereResource表示客户端与服务器之间在该连接生命周期内的连接。通过来自同一客户端的onRequest()方法,uuid在多个调用上保持对象的一致性。因此,每次调用onRequest方法时,相同的AtmosphereResource对象都会添加EventListener。

这似乎不对。这会导致为每个AtmosphereResource注册数以千计的EventListener吗?

似乎只能为每个AtmosphereResource注册一次EventLister。

我觉得我在这里缺少一些基本的东西。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:3)

这里使用example MeteorServlet,所以它看起来不像你必须要做的那样,但它应该让你开始。我将监听器添加到Meteor实例,然后您将其添加到AtmosphereResource。每个资源只有一个监听器。

重写的onDisconnect()方法调用处理事件的this Grails service method。当然,您将要调用清理数据库资源的内容。

请注意,使用these options配置servlet。我想你可能需要org.atmosphere.interceptor.HeartbeatInterceptor,但是自从我最初设置它以来已经很久了,我不记得是否有必要。