как передать параметры в конечную точку Websocket Hander - PullRequest
0 голосов
/ 13 февраля 2020

Когда я создаю веб-сокет Jetty, я регистрирую свой обработчик конечной точки следующим образом:

public class MyWebSocketEndpoint extends WebSocketServlet {

    @Override
    public void configure(WebSocketServletFactory webSocketServletFactory) {
        webSocketServletFactory.register(MyEndpointHandler.class);
    }
}

для класса MyEndpoingHandler, я не могу определить конструктор с некоторыми параметрами, или он получит исключение во время выполнения. Как я могу передать некоторые параметры при создании экземпляра MyEndpointHandler?

1 Ответ

0 голосов
/ 13 февраля 2020

Используйте WebSocketCreator.

Когда вы звоните WebSocketServletFactory.register(MyEndpoingHandler.class), все, что происходит внутри, эквивалентно ...

@Override
public void register(Class<?> websocketPojo)
{
    this.setCreator(new SingleEndpointCreator(websocketPojo));
}

Полный пример для WebSocketCreator:

package websocket;

import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;

public class DemoWebSocketCreator
{
    public static class MyWebSocketServlet extends WebSocketServlet
    {
        @Override
        public void configure(WebSocketServletFactory wsFactory)
        {
            wsFactory.setCreator(new MyWebSocketCreator());
        }
    }

    public static class MyWebSocketCreator implements WebSocketCreator
    {
        private AtomicInteger idGen = new AtomicInteger(0);

        @Override
        public Object createWebSocket(ServletUpgradeRequest servletUpgradeRequest, ServletUpgradeResponse servletUpgradeResponse)
        {
            String id = "ws" + idGen.incrementAndGet();
            return new MyWebSocket(id);
        }
    }

    @WebSocket
    public static class MyWebSocket
    {
        private final String id;

        public MyWebSocket(String id)
        {
            this.id = id;
        }

        @OnWebSocketMessage
        public void onMessage(Session session, String msg)
        {
            try
            {
                session.getRemote().sendString("Hello, my id is [" + id + "]: You said: " + msg);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);

        ServletContextHandler context = new ServletContextHandler();
        context.setContextPath("/");
        context.addServlet(MyWebSocketServlet.class, "/ws/");
        // always last, and on default pathspec
        context.addServlet(DefaultServlet.class, "");

        HandlerList handlers = new HandlerList();
        handlers.addHandler(context);
        handlers.addHandler(new DefaultHandler());

        server.setHandler(handlers);
        server.start();
        server.join();
    }
}

...