Commit 9144b122220606f6b6223f7375b95542ee49de6f

Authored by Thomas Ziemer
1 parent 975ad860

feature: WebSockets um Logging und Parameter erweitert

src/main/java/net/ziemers/swxercise/ui/ws/WebSocketController.java
1 package net.ziemers.swxercise.ui.ws; 1 package net.ziemers.swxercise.ui.ws;
2 2
3 -import javax.enterprise.context.ApplicationScoped;  
4 -import javax.websocket.CloseReason;  
5 -import javax.websocket.OnClose;  
6 -import javax.websocket.OnMessage;  
7 -import javax.websocket.OnOpen;  
8 -import javax.websocket.Session; 3 +import org.slf4j.Logger;
  4 +import org.slf4j.LoggerFactory;
  5 +
  6 +import javax.annotation.PostConstruct;
  7 +import javax.websocket.*;
  8 +import javax.websocket.server.PathParam;
9 import javax.websocket.server.ServerEndpoint; 9 import javax.websocket.server.ServerEndpoint;
10 import java.io.IOException; 10 import java.io.IOException;
  11 +import java.util.Collections;
  12 +import java.util.HashSet;
  13 +import java.util.Set;
11 14
12 /** 15 /**
13 * Stub für die WebSocket-Unterstützung. 16 * Stub für die WebSocket-Unterstützung.
  17 + *
  18 + * Muss bei Bedarf noch um ein JSON-Marshalling erweitert werden.
  19 + *
  20 + * Aufgepasst: Mittels CDI kann nur @ApplicationScoped injiziert werden,
  21 + * da während eines WebSocket-Callbacks kein Session-Kontext aktiv ist.
14 */ 22 */
15 -@ApplicationScoped  
16 @ServerEndpoint(WebSocketController.serverEndpointPath) 23 @ServerEndpoint(WebSocketController.serverEndpointPath)
17 public class WebSocketController { 24 public class WebSocketController {
18 25
19 - static final String serverEndpointPath = "/ws/api/v1/anEndpoint"; 26 + static final String serverEndpointPath = "/ws/api/v1/anEndpoint/{aParameter}";
  27 +
  28 + private static Set<Session> peers = Collections.synchronizedSet(new HashSet<>());
  29 +
  30 + private Logger logger;
  31 +
  32 + @PostConstruct
  33 + private void init() {
  34 + logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
  35 + }
20 36
21 /** 37 /**
22 * Callback-Methode für das Öffnen einer neuen WebSocket-Verbindung. 38 * Callback-Methode für das Öffnen einer neuen WebSocket-Verbindung.
@@ -25,7 +41,8 @@ public class WebSocketController { @@ -25,7 +41,8 @@ public class WebSocketController {
25 */ 41 */
26 @OnOpen 42 @OnOpen
27 public void onOpen(Session session) { 43 public void onOpen(Session session) {
28 - System.out.println("WebSocket opened with session id #" + session.getId()); 44 + logger.info("WebSocket opened with session id #{}", session.getId());
  45 + peers.add(session);
29 } 46 }
30 47
31 /** 48 /**
@@ -35,16 +52,27 @@ public class WebSocketController { @@ -35,16 +52,27 @@ public class WebSocketController {
35 * @param session das {@link Session}-Objekt der sendenden WebSocket-Verbindung 52 * @param session das {@link Session}-Objekt der sendenden WebSocket-Verbindung
36 */ 53 */
37 @OnMessage 54 @OnMessage
38 - public void onMessage(String message, Session session) {  
39 - System.out.println("WebSocket Message '" + message + "' received by session id #" + session.getId()); 55 + public void onMessage(String message, Session session, @PathParam("aParameter") String param) {
  56 + logger.info("WebSocket Message '{}/{}' received by session id #{}", message, param, session.getId());
40 try { 57 try {
41 - session.getBasicRemote().sendText(message); 58 + // wir senden die empfangene Nachricht gleich wieder zurück
  59 + session.getBasicRemote().sendText(String.format("%s/%s", message, param));
42 } catch (IOException e) { 60 } catch (IOException e) {
43 e.printStackTrace(); 61 e.printStackTrace();
44 } 62 }
45 } 63 }
46 64
47 /** 65 /**
  66 + * Callback-Methode, wenn in der WebSocket ein Problem auftrat.
  67 + *
  68 + * @param t die Exception
  69 + */
  70 + @OnError
  71 + public void onError(Throwable t) {
  72 + logger.error("WebSocket Error '{}' occured!", t.getMessage());
  73 + }
  74 +
  75 + /**
48 * Callback-Methode für das Schließen einer geöffneten WebSocket-Verbindung. 76 * Callback-Methode für das Schließen einer geöffneten WebSocket-Verbindung.
49 * 77 *
50 * @param reason die Ursache für das Schließen der WebSocket-Verbindung 78 * @param reason die Ursache für das Schließen der WebSocket-Verbindung
@@ -52,7 +80,8 @@ public class WebSocketController { @@ -52,7 +80,8 @@ public class WebSocketController {
52 */ 80 */
53 @OnClose 81 @OnClose
54 public void onClose(CloseReason reason, Session session) { 82 public void onClose(CloseReason reason, Session session) {
55 - System.out.println("Closing WebSocket due to " + reason.getReasonPhrase() + " by id #" + session.getId()); 83 + logger.info("Closing WebSocket due to '{}' by session id #{}", reason.getReasonPhrase(), session.getId());
  84 + peers.remove(session);
56 } 85 }
57 86
58 } 87 }
src/main/webapp/websockets.html
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 </head> 6 </head>
7 <body> 7 <body>
8 <script> 8 <script>
9 - var url = "ws://localhost:8080/swxercise/ws/api/v1/anEndpoint"; 9 + var url = "ws://localhost:8080/swxercise/ws/api/v1/anEndpoint/4711";
10 var webSocket = new WebSocket(url); 10 var webSocket = new WebSocket(url);
11 11
12 // Callback-Methoden für die WebSocket-Kommunikation 12 // Callback-Methoden für die WebSocket-Kommunikation