aboutsummaryrefslogtreecommitdiff
path: root/juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2017-11-02 16:02:17 +0300
committerGravatar Vitaly Takmazov2017-11-02 16:12:40 +0300
commitee20020d9c576a48173c13b68b03d349c0ec3e47 (patch)
tree7c59dcac74cde4e5b819a245dc0fbbb315020f10 /juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java
parent61c6a3fe338a5cbbef55081f8ac26011c053125d (diff)
server-web: base websocket component with autoreconnect
Diffstat (limited to 'juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java')
-rw-r--r--juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java56
1 files changed, 56 insertions, 0 deletions
diff --git a/juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java b/juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java
new file mode 100644
index 00000000..96b8c398
--- /dev/null
+++ b/juick-server-web/src/main/java/com/juick/server/component/JuickServerComponent.java
@@ -0,0 +1,56 @@
+package com.juick.server.component;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.PingMessage;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+import javax.inject.Inject;
+import java.io.IOException;
+
+public class JuickServerComponent extends TextWebSocketHandler {
+ private static Logger logger = LoggerFactory.getLogger(JuickServerComponent.class);
+ @Inject
+ private ApplicationEventPublisher applicationEventPublisher;
+ @Inject
+ private ObjectMapper jsonMapper;
+
+ private WebSocketSession session;
+
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ logger.info("WebSocket connected");
+ this.session = session;
+ }
+
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+ logger.info("WebSocket disconnected with code {}: {}", status.getCode(), status.getReason());
+ applicationEventPublisher.publishEvent(new DisconnectedEvent(this));
+ }
+
+ @Override
+ protected void handleTextMessage(WebSocketSession session, TextMessage text) throws Exception {
+ com.juick.Message jmsg = jsonMapper.readValue(text.asBytes(), com.juick.Message.class);
+
+ if (logger.isInfoEnabled()) // prevent writeValueAsString execution if logger disabled
+ logger.info("got jmsg: {}", jsonMapper.writeValueAsString(jmsg));
+ applicationEventPublisher.publishEvent(new MessageEvent(this, jmsg));
+ }
+
+ @Scheduled(fixedRate = 30000, initialDelay = 30000)
+ public void ping() throws IOException {
+ if (session != null && session.isOpen()) {
+ logger.debug("Sending WebSocket ping");
+ session.sendMessage(new PingMessage());
+ } else {
+ applicationEventPublisher.publishEvent(new DisconnectedEvent(this));
+ }
+ }
+}