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 e3a337af9c..d1df671972 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 internalSessionMap = new ConcurrentHashMap<>(); private static final ConcurrentMap 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();