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>
건배, 당신은 웹 소켓 채팅 샘플을 구현하는 방식 대신은 web.xml 및 atmosphere.xml를 사용하는 자바 통해 인스턴스 서블릿으로 날 지점 수 없습니다. 저지 서블릿을 제거하려고했는데 (응용 프로그램에 필요합니다. 둘 다 실행해야합니다.) 오류가 있습니다. "com.sun.jersey.api.container.ContainerException : ResourceConfig 인스턴스에 아무 것도 포함되어 있지 않습니다. 루트 리소스 클래스. " - 고마워요 –
글쎄, 나는 방파제의 웹 소켓만을 사용할 것이고 내 용도로는 충분할 것이다. 그런데 프레임 워크는 훌륭합니다. Bonne journée! –