Java 使用嵌入式atmosphere和jersey servlet运行Websocket连接

Java 使用嵌入式atmosphere和jersey servlet运行Websocket连接,java,websocket,jetty,embedded-jetty,atmosphere,Java,Websocket,Jetty,Embedded Jetty,Atmosphere,我试图让Atmosphere的一个实例作为servlet运行,而不使用Web.xml和WebSocket函数性 映射似乎不起作用,因为我能够连接到服务器(localhost:8080),JavaScript告诉我WS连接正在工作,但处理程序没有被识别(从未调用方法)。WebSocketHandlerAdapter似乎从未被AtmosphereServlet使用过 我找到的所有示例都是使用Web.xml来设置servlet,但我需要能够以编程方式实例化我的servlet(Jetty容器中的Atmo

我试图让Atmosphere的一个实例作为servlet运行,而不使用Web.xml和WebSocket函数性

映射似乎不起作用,因为我能够连接到服务器(localhost:8080),JavaScript告诉我WS连接正在工作,但处理程序没有被识别(从未调用方法)。WebSocketHandlerAdapter似乎从未被AtmosphereServlet使用过

我找到的所有示例都是使用Web.xml来设置servlet,但我需要能够以编程方式实例化我的servlet(Jetty容器中的Atmosphere和Jersey)

在过去的几天里,我一直在做这件事,现在我开始发疯了。。请有人给我一些建议:)

我在WebSocketHandlerAdapter设置中使用了这个示例,并在Jetty中实例化了我的servlet

非常感谢

布鲁诺·加农·亚当

这是我用来实例化服务器/servlet的代码:

public Server create() throws Exception {
    logger.info("creating http server");
    Server server = new Server();
    server.setStopAtShutdown(true);

    // configure http
    SelectChannelConnector httpConnector = new SelectChannelConnector();
    httpConnector.setPort(config.getHttpPort());
    server.setConnectors(new Connector[] { httpConnector });

    handlers = new HandlerCollection();
    handlers.setServer(server);
    handlers.addHandler(createLoggingHandler());
    handlers.addHandler(createFileHandler());
    handlers.addHandler(createJerseyRestServletHandler());
    server.setHandler(handlers);
    return server;
}

private ServletContextHandler createJerseyRestServletHandler() {
    ServletHolder atmosphereHolder = initAtmosphereServletHolder();
    ServletHolder jerseyHolder = initJerseyServletHolder();

    // atmosphere
    atmosphereHolder.setInitParameter("org.atmosphere.useWebSocket", "true");
    atmosphereHolder.setInitParameter("WebSocketProtocol", "ChatAtmosphereHandler");
    atmosphereHolder.setAsyncSupported(true);

    FilterHolder filterHolder = new FilterHolder(CrossOriginFilter.class);
    filterHolder.setInitParameter("allowedOrigins", "*");
    filterHolder.setInitParameter("allowedMethods", "GET, POST");

    ServletContextHandler servletHandler = new ServletContextHandler(handlers, "/");
    servletHandler.addServlet(atmosphereHolder, "/websocket/*");
    servletHandler.addServlet(jerseyHolder, "/jersey/*");
    servletHandler.addFilter(filterHolder, "/*", null);

    return servletHandler;
}

private ServletHolder initJerseyServletHolder() {
        ...
}

private ServletHolder initAtmosphereServletHolder() {
    AtmosphereServlet atmosServlet = new AtmosphereServlet();
    ServletHolder atmosphere = new ServletHolder(atmosServlet);

    return atmosphere;
}

处理程序websocket:

@WebSocketHandlerService(path = "/websocket", broadcaster = SimpleBroadcaster.class)
public class ChatAtmosphereHandler extends WebSocketHandlerAdapter {

private final ObjectMapper mapper = new ObjectMapper();

@Override
public void onOpen(WebSocket webSocket) throws IOException {
    System.out.println("on Open");
    webSocket.resource().setBroadcaster(BroadcasterFactory.getDefault().lookup("/websocket", true));
}

public void onTextMessage(WebSocket webSocket, String message) throws IOException {
    System.out.println("on Message");
    AtmosphereResource r = webSocket.resource();
    Broadcaster b = r.getBroadcaster();
    b.broadcast(mapper.writeValueAsString(mapper.readValue(message, Data.class)));
}

public final static class Data {

    private String message;
    private String author;
    private long time;

    public Data() {
        this("", "");
    }

    public Data(String author, String message) {
        this.author = author;
        this.message = message;
        this.time = new Date().getTime();
    }

    public String getMessage() {
        return message;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }
}
}
最后是pom.xml

        <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlets</artifactId>
        <version>7.6.4.v20120524</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-websocket</artifactId>
        <version>7.6.4.v20120524</version>
    </dependency>
    <dependency>
        <groupId>eu.infomas</groupId>
        <artifactId>annotation-detector</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.3</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-annotations</artifactId>
        <version>1.1.0.beta3</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-jersey</artifactId>
        <version>1.1.0.beta3</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-commons</artifactId>
        <version>0.6.5</version>
    </dependency>

org.eclipse.jetty
防波堤小艇
7.6.4.v20120524
org.eclipse.jetty
码头腹板箱
7.6.4.v20120524
eu.infomas
注释检测器
3.0.0
org.codehaus.jackson
杰克逊地图绘制者
1.9.3
组织气氛
大气注释
1.1.0.3
组织气氛
大气运动衫
1.1.0.3
组织气氛
大气公地
0.6.5
敬礼

[我是领队]

你能粘贴你服务器的日志吗?此外,url应该是localhost:8080/websocket/用于连接

第二,为什么要定义Jersey Servlet?对于Atmosphere,您不需要这样做,所以只需定义AtmosphereServlet即可

如果可以的话,请跳上以了解更多信息

--Jeanfrancois

致敬

[我是领队]

你能粘贴你服务器的日志吗?此外,url应该是localhost:8080/websocket/用于连接

第二,为什么要定义Jersey Servlet?对于Atmosphere,您不需要这样做,所以只需定义AtmosphereServlet即可

如果可以的话,请跳上以了解更多信息


--Jeanfrancois

Salot,你能告诉我一种实现WebSocket聊天示例的方法吗,但是使用java实例化的servlet,而不是使用web.xml和atmosphere.xml。我试图删除jersey servlet(这是我的应用程序所必需的,我需要同时运行这两个…),但我有一个错误:“com.sun.jersey.api.container.ContainerException:ResourceConfig实例不包含任何根资源类。”--谢谢,我将只使用Jetty的Websocket,它对我的应用程序来说就足够了。顺便说一句,你的框架很棒,Bonne Journe!敬礼,你能告诉我一种实现WebSocket聊天示例的方法吗,但是使用java实例化的servlet,而不是使用web.xml和atmosphere.xml。我试图删除jersey servlet(这是我的应用程序所必需的,我需要同时运行这两个…),但我有一个错误:“com.sun.jersey.api.container.ContainerException:ResourceConfig实例不包含任何根资源类。”--谢谢,我将只使用Jetty的Websocket,它对我的应用程序来说就足够了。顺便说一句,你的框架很棒,Bonne Journe!