While it *is* possible to have a WebSocketHandler mixed with a
WebAppContext, its not really the ideal setup.

First, here's how your specific scenario is setup ...

package jetty.websocket;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.webapp.WebAppContext;

public class MyEmbeddedServer
{
    public static void main(String[] args)
    {
        Server server = new Server(8080);
        HandlerList handlers = new HandlerList();
        server.setHandler(handlers);

        // Add websocket handler
        ContextHandler wshandler = new ContextHandler("/ws");
        wshandler.setHandler(new MyHandler());

        handlers.addHandler(wshandler);

        // Add web app
        WebAppContext webapp = new WebAppContext();
        webapp.setWar("src/test/wars/webapp-b.war");
        webapp.setContextPath("/app");

        handlers.addHandler(webapp);

        // Add default handler (for errors and whatnot)
        handlers.addHandler(new DefaultHandler());

        // Lets see how the server is setup after it is started
        server.setDumpAfterStart(true);

        try
        {
            // Start the server thread
            server.start();
            // Wait for the server thread to end
            server.join();
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.err);
        }
    }
}

End result of this is ...

http://localhost:8080/ws/  <-- the WebSocketHandler of yours (implemented
as MyHandler), only responds to websocket upgrade,
http://localhost:8080/app/  <-- the WebAppContext

Any other requests, such as ...
http://localhost:8080/  will result in DefaultHandler showing you an error
(nothing at root context)
http://localhost:8080/foo/  will result in DefaultHandler showing you an
error (not a valid context)
http://localhost:8080/ws  (note the missing slash a the end), will result
in a 302 redirect to http://localhost:8080/ws/

The biggest problem with this is that your WebSocketHandler and the
WebAppContext cannot talk to each other directly, as they are in
different/isolated classloaders.

Why not just put your websocket class into the webapp itself?
Its far easier, and you suffer no impacts on performance.

Just use a WebSocketServlet instead of a WebSocketHandler, the rest of the
code should be identical.
Or, you can use the javax.websocket.* standard to implement websocket
within your webapp.
(Have to use Jetty 9.2+ for that tho)




--
Joakim Erdfelt <[email protected]>
webtide.com <http://www.webtide.com/> - intalio.com/jetty
Expert advice, services and support from from the Jetty & CometD experts
eclipse.org/jetty - cometd.org


On Tue, Jul 8, 2014 at 3:01 AM, Dmitry Polovka <[email protected]> wrote:

> May be there is any alternative solutions? If nobody is answering…
>
> On 5 Jul 2014, at 14:29, Dmitry Polovka <[email protected]> wrote:
>
> > Hey, i’m literally 3 weeks in Java community transitioning from PHP.
> > I experience problem with configuring Jetty server to run WebAppContext
> with WebSocketHandler.
> > I tried to add WebSocketHandler to WebAppContext as parent handler, bind
> two handlers via HandlerCollection, but i clearly do something wrong.
> > Here is my default WebAppContext configuration:
> >
> > public static void main(String[] args) throws Exception
> > {
> >       ServerConnector connector = new ServerConnector(server);
> >       connector.setPort(8080);
> >       server.addConnector(connector);
> >
> >       WebAppContext context = new WebAppContext("webapp", "/");
> >
> >       // Setting up browser caching. Binds params for
> org.eclipse.jetty.servlet.DefaultServlet.init()
> >
> context.getInitParams().put("org.eclipse.jetty.servlet.Default.etags",
> "true");
> >
> context.getInitParams().put("org.eclipse.jetty.servlet.Default.cacheControl",
> "public, max-age=0");
> >
> >       // Will throw an exception when will be unable to start server for
> some reason
> >       context.setThrowUnavailableOnStartupException(true);
> >
> >       server.setHandler(context);
> >
> >       server.start();
> >       server.join();
> > }
> >
> > My goal is to add web socket support. May be to some /ws address, but on
> same port as main instance. Which options do I have?
>
> _______________________________________________
> jetty-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users
>
_______________________________________________
jetty-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to