2013-02-06 6 views
1

Web.xml을 사용하지 않고 WebSocket functionnality를 사용하여 Atmosphere 인스턴스를 서블릿으로 실행하려고합니다.포함 된 대기열 및 저지 서블릿을 사용하여 웹 소켓 연결 실행

서버 (localhost : 8080)에 연결할 수 있고 JavaScript에서 WS 연결이 작동하지만 처리기가 인식되지 않는다고 (메소드가 절대로 발견되지 않기 때문에) 매핑이 작동하지 않는 것 같습니다. 라는). WebSocketHandlerAdapter는 AtmosphereServlet에서 사용 된 적이없는 것 같습니다.

Servlets을 설정하기 위해 Web.xml을 사용하는 모든 예제가 있지만 프로그래밍 방식으로 Servlet (Jetty 컨테이너의 Atmosphere 및 Jersey)을 인스턴스화 할 수 있어야합니다.

나는 지난 몇 일 동안이 일을하고 있었고, 나는 내 머리를 쾅쾅 거리기 시작했다. 누군가 나에게 조언을 해줘. :).

WebSocketHandlerAdapter 설정에 Atmosphere Websocket Chat을 사용하고 Jetty에 내 서블릿을 구현하기 위해 Jersey Atmosphere Servlet을 사용했습니다.

감사합니다.

브루노의 Gagnon - 아담은

여기 내 서버/서블릿을 실체화 내 코드입니다. :

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; 
} 

핸들러 웹 소켓 :

@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> 

답변

1

건배,

가 [나는 분위기 리드 해요]

서버의 로그를 붙여 넣을 수 있습니까? 또한 url은 연결을 위해 localhost : 8080/websocket /이어야합니다.

둘째, 왜 Jersey Servlet을 정의하고 있습니까? Atmosphere와 함께 필요하지 않으므로 AtmosphereServlet을 정의하십시오.

가능한 경우 자세한 내용은 mailing list으로 이동하십시오.

- Jeanfrancois

+0

건배, 당신은 웹 소켓 채팅 샘플을 구현하는 방식 대신은 web.xml 및 atmosphere.xml를 사용하는 자바 통해 인스턴스 서블릿으로 날 지점 수 없습니다. 저지 서블릿을 제거하려고했는데 (응용 프로그램에 필요합니다. 둘 다 실행해야합니다.) 오류가 있습니다. "com.sun.jersey.api.container.ContainerException : ResourceConfig 인스턴스에 아무 것도 포함되어 있지 않습니다. 루트 리소스 클래스. " - 고마워요 –

+0

글쎄, 나는 방파제의 웹 소켓만을 사용할 것이고 내 용도로는 충분할 것이다. 그런데 프레임 워크는 훌륭합니다. Bonne journée! –