thingsboard-memoizeit

Fix for errors during shutdown

2/3/2017 4:07:54 PM

Details

diff --git a/application/src/main/java/org/thingsboard/server/controller/plugin/PluginWebSocketHandler.java b/application/src/main/java/org/thingsboard/server/controller/plugin/PluginWebSocketHandler.java
index e3a337a..d1df671 100644
--- a/application/src/main/java/org/thingsboard/server/controller/plugin/PluginWebSocketHandler.java
+++ b/application/src/main/java/org/thingsboard/server/controller/plugin/PluginWebSocketHandler.java
@@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.BeanCreationNotAllowedException;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -57,10 +58,12 @@ public class PluginWebSocketHandler extends TextWebSocketHandler implements Plug
     private static final ConcurrentMap<String, SessionMetaData> internalSessionMap = new ConcurrentHashMap<>();
     private static final ConcurrentMap<String, String> externalSessionMap = new ConcurrentHashMap<>();
 
-    @Autowired @Lazy
+    @Autowired
+    @Lazy
     private ActorService actorService;
 
-    @Autowired @Lazy
+    @Autowired
+    @Lazy
     private PluginService pluginService;
 
     @Override
@@ -105,7 +108,7 @@ public class PluginWebSocketHandler extends TextWebSocketHandler implements Plug
         super.handleTransportError(session, tError);
         SessionMetaData sessionMd = internalSessionMap.get(session.getId());
         if (sessionMd != null) {
-            actorService.process(new SessionEventPluginWebSocketMsg(sessionMd.sessionRef, SessionEvent.onError(tError)));
+            processInActorService(new SessionEventPluginWebSocketMsg(sessionMd.sessionRef, SessionEvent.onError(tError)));
         } else {
             log.warn("[{}] Failed to find session", session.getId());
         }
@@ -118,11 +121,19 @@ public class PluginWebSocketHandler extends TextWebSocketHandler implements Plug
         SessionMetaData sessionMd = internalSessionMap.remove(session.getId());
         if (sessionMd != null) {
             externalSessionMap.remove(sessionMd.sessionRef.getSessionId());
-            actorService.process(new SessionEventPluginWebSocketMsg(sessionMd.sessionRef, SessionEvent.onClosed()));
+            processInActorService(new SessionEventPluginWebSocketMsg(sessionMd.sessionRef, SessionEvent.onClosed()));
         }
         log.info("[{}] Session is closed", session.getId());
     }
 
+    private void processInActorService(SessionEventPluginWebSocketMsg msg) {
+        try {
+            actorService.process(msg);
+        } catch (BeanCreationNotAllowedException e) {
+            log.warn("[{}] Failed to close session due to possible shutdown state", msg.getSessionRef().getSessionId());
+        }
+    }
+
     private PluginWebsocketSessionRef toRef(WebSocketSession session) throws IOException {
         URI sessionUri = session.getUri();
         String path = sessionUri.getPath();