On Thu, 28 Feb 2019 at 21:29, Austin Bookhart <
austin.bookh...@hannonhill.com> wrote:

> Hi,
>
> I have a question regarding an asynchronous websocket implementation
> we have in our application. We have run into issues where on a rare
> occasion the websocket endpoint will become unusable due to what seems
> to be a thread holding onto resources and not releasing them. Below is
> the main structure of our endpoint. Some parts have been removed or
> commented out, but it gets the basic structure across.
>
> We call "sendMessageToUser" in order to send a message to a client's
> browser. The issue that we have seen is if we breakpoint at the line
> that waits for the future to resolve, "future.get()", and reload the
> current client's browser, the endpoint becomes unusable where no
>

The code below is very weird code to me, but i guess this is just to show
it?
Because if i look at the doc of the Async.sendText()
Then the get() of the Future should throw an exception on connections
errors.
But in your case it just never resolves?




> messages can be sent or received any longer. Only a restart resolves
> the issue. We wanted to find out if our implementation of the
> asynchronous remote and future setup is correct or if there is a more
> appropriate use of the API?
>
> Appreciate any help you can provide.
> Thanks,
> Austin
>
> @ServerEndpoint(value = "/websocket", configurator =
> GetHttpSessionConfigurator.class)
> public class WebSocketEndpoint
> {
>     private static final Map<Session, SessionDetails> clients =
> Collections.synchronizedMap(new HashMap<Session, SessionDetails>());
>     private static Future<Void> future = null;
>
>     public static void sendMessageToUser(String username,
> WebSocketMessage message)
>     {
>         synchronized (clients)
>         {
>             clients.keySet().stream()
>                     .filter(client ->
> username.equals(clients.get(client).username))
>                     .forEach(client -> sendMessage(client, message));
>         }
>     }
>
>     private static synchronized void sendMessage(Session client,
> WebSocketMessage message)
>     {
>         try
>         {
>             if (future == null)
>                 LOG.debug("Sending very first WebSocket message");
>             else
>             {
>                 // Before we send the next message, we have to wait
> for the previous message to complete
>                 LOG.debug("Waiting until last WebSocket message is being
> sent");
>                 future.get();
>
>                 LOG.debug("Last WebSocket message is not longer being
> sent. Sending a new message.");
>             }
>
>
>             // Send the message and store the Future for the next call
>             future =
> client.getAsyncRemote().sendText(message.getJSONObject().toString());
>         }
>         catch (Exception e)
>         {
>             LOG.debug("An error occurred when sending a web socket
> message to client " + client, e);
>         }
>     }
>
>     @OnOpen
>     public void onOpen(Session client, EndpointConfig config)
>     {
>         //Construct SessionDetails information
>         clients.put(client, new SessionDetails(..));
>     }
>
>     @OnClose
>     public void onClose(Session client)
>     {
>         clients.remove(client);
>     }
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

-- 
Johan Compagner
Servoy

Reply via email to