I am broadcasting to each peer in a loop. Looks like when I refresh the
page the socket is not gracefully closed and peer reference still remains
in server
When messages are broadcasted it throws invocation target exception. Any
suggestion to gracefully close the socket upon refresh ?
@WebSocketOpen
public void onOpen(Session peer) {
System.out.println("New user got connected");
peers.add(peer);
}
@WebSocketClose
public void onClose(Session peer) {
peers.remove(peer);
}
@WebSocketMessage
public void boradcastFigure(String msg, Session session) throws
IOException {
System.out.println("Broadcasting the message " + msg);
for (Session peer : peers) {
if (!peer.equals(session)) {
peer.getRemote().sendString(msg);
}
}
}
--
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at
org.glassfish.tyrus.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:336)
at
org.glassfish.tyrus.AnnotatedEndpoint.access$000(AnnotatedEndpoint.java:74)
at
org.glassfish.tyrus.AnnotatedEndpoint$BasicHandler$1.onMessage(AnnotatedEndpoint.java:406)
at
org.glassfish.tyrus.SessionImpl.notifyMessageHandlers(SessionImpl.java:265)
at org.glassfish.tyrus.EndpointWrapper.onMessage(EndpointWrapper.java:306)
at
org.glassfish.tyrus.grizzly.GrizzlyEndpoint.onMessage(GrizzlyEndpoint.java:138)
at
org.glassfish.grizzly.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:164)
at
org.glassfish.grizzly.websockets.frametypes.TextFrameType.respond(TextFrameType.java:70)
at org.glassfish.grizzly.websockets.DataFrame.respond(DataFrame.java:104)
at
org.glassfish.grizzly.websockets.WebSocketFilter.handleRead(WebSocketFilter.java:221)
at
org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at
org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:273)
at
org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at
org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134)
at
org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at
org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at
org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:818)
at
org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at
org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at
org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at
org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at
org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:562)
at
org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:542)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:474)
at
org.glassfish.tyrus.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:334)
... 23 more
Caused by: java.lang.RuntimeException: Socket is not connected.
at
org.glassfish.grizzly.websockets.DefaultWebSocket.send(DefaultWebSocket.java:208)
at
org.glassfish.tyrus.grizzly.GrizzlyRemoteEndpoint.sendString(GrizzlyRemoteEndpoint.java:82)
at
org.glassfish.tyrus.RemoteEndpointWrapper.sendString(RemoteEndpointWrapper.java:78)
at com.mycompany.slate.Slate.boradcastFigure(Slate.java:52)
... 27 more