1717import org .red5 .net .websocket .model .WSMessage ;
1818import org .red5 .server .api .scope .IScope ;
1919import org .red5 .server .plugin .PluginRegistry ;
20+ import org .red5 .server .util .ScopeUtils ;
2021import org .slf4j .Logger ;
2122import org .slf4j .LoggerFactory ;
2223import org .springframework .beans .factory .DisposableBean ;
@@ -31,6 +32,8 @@ public class WebSocketScope implements InitializingBean, DisposableBean {
3132
3233 private static Logger log = LoggerFactory .getLogger (WebSocketScope .class );
3334
35+ private WebSocketScopeManager manager ;
36+
3437 protected CopyOnWriteArraySet <WebSocketConnection > conns = new CopyOnWriteArraySet <>();
3538
3639 protected CopyOnWriteArraySet <IWebSocketDataListener > listeners = new CopyOnWriteArraySet <>();
@@ -63,7 +66,8 @@ public void destroy() throws Exception {
6366 */
6467 public void register () {
6568 log .info ("Application scope: {}" , scope );
66- WebSocketScopeManager manager = ((WebSocketPlugin ) PluginRegistry .getPlugin (WebSocketPlugin .NAME )).getManager (scope );
69+ // get the manager on registration and keep a reference locally
70+ manager = ((WebSocketPlugin ) PluginRegistry .getPlugin (WebSocketPlugin .NAME )).getManager (scope );
6771 if (manager .setApplication (scope )) {
6872 log .info ("WebSocket app added: {}" , scope .getName ());
6973 }
@@ -76,6 +80,12 @@ public void register() {
7680 * Un-registers from the WebSocketScopeManager.
7781 */
7882 public void unregister () {
83+ // remove app scope registration only if we're an app scope
84+ if (ScopeUtils .isApp (scope )) {
85+ manager .removeApplication (scope );
86+ }
87+ // remove ourself
88+ manager .removeWebSocketScope (this );
7989 // clean up the connections by first closing them
8090 conns .forEach (conn -> {
8191 conn .close ();
@@ -95,7 +105,8 @@ public void unregister() {
95105 * @return WebSocketConnection for the given id or null if not found
96106 */
97107 public WebSocketConnection getConnectionBySessionId (String id ) {
98- Optional <WebSocketConnection > opt = conns .stream ().filter (conn -> id .equals (conn .getHttpSessionId ())).findFirst ();
108+ log .debug ("getConnectionBySessionId: {}" , id );
109+ Optional <WebSocketConnection > opt = conns .stream ().filter (conn -> id .equals (conn .getSessionId ())).findFirst ();
99110 if (opt .isPresent ()) {
100111 return opt .get ();
101112 }
@@ -155,12 +166,18 @@ public String getPath() {
155166 * @param conn WebSocketConnection
156167 */
157168 public void addConnection (WebSocketConnection conn ) {
158- if (conns .add (conn )) {
159- for (IWebSocketDataListener listener : listeners ) {
160- listener .onWSConnect (conn );
169+ // prevent false failed logging when a connection is already registered
170+ if (!conns .contains (conn )) {
171+ if (conns .add (conn )) {
172+ log .debug ("Added connection: {}" , conn );
173+ for (IWebSocketDataListener listener : listeners ) {
174+ listener .onWSConnect (conn );
175+ }
176+ } else {
177+ log .warn ("Add connection failed for: {}" , conn );
161178 }
162179 } else {
163- log .warn ("Add connection failed for : {}" , conn );
180+ log .debug ("Add connection skipped, already registered : {}" , conn );
164181 }
165182 }
166183
@@ -170,12 +187,18 @@ public void addConnection(WebSocketConnection conn) {
170187 * @param conn WebSocketConnection
171188 */
172189 public void removeConnection (WebSocketConnection conn ) {
173- if (conns .remove (conn )) {
174- for (IWebSocketDataListener listener : listeners ) {
175- listener .onWSDisconnect (conn );
190+ // prevent false failed logging when a connection isnt registered
191+ if (conns .contains (conn )) {
192+ if (conns .remove (conn )) {
193+ log .debug ("Removed connection: {}" , conn );
194+ for (IWebSocketDataListener listener : listeners ) {
195+ listener .onWSDisconnect (conn );
196+ }
197+ } else {
198+ log .warn ("Remove connection failed for: {}" , conn );
176199 }
177200 } else {
178- log .warn ("Remove connection failed for : {}" , conn );
201+ log .debug ("Remove connection skipped, not registered : {}" , conn );
179202 }
180203 }
181204
@@ -185,7 +208,7 @@ public void removeConnection(WebSocketConnection conn) {
185208 * @param listener IWebSocketDataListener
186209 */
187210 public void addListener (IWebSocketDataListener listener ) {
188- log .info ("addListener: {}" , listener );
211+ log .debug ("addListener to {} : {}" , path , listener );
189212 listeners .add (listener );
190213 }
191214
@@ -195,7 +218,7 @@ public void addListener(IWebSocketDataListener listener) {
195218 * @param listener IWebSocketDataListener
196219 */
197220 public void removeListener (IWebSocketDataListener listener ) {
198- log .info ("removeListener: {}" , listener );
221+ log .debug ("removeListener from {} : {}" , path , listener );
199222 listeners .remove (listener );
200223 }
201224
@@ -206,7 +229,7 @@ public void removeListener(IWebSocketDataListener listener) {
206229 * list of IWebSocketDataListener
207230 */
208231 public void setListeners (Collection <IWebSocketDataListener > listeners ) {
209- log .trace ("setListeners: {}" , listeners );
232+ log .trace ("setListeners on {} : {}" , path , listeners );
210233 this .listeners .addAll (listeners );
211234 }
212235
0 commit comments