Thursday, October 8, 2009

comet

자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat 소스

자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat

Corund 님의 글을 보고 테스트한 샘플코드를 올립니다.comet_tomcat.zip

* 스크립트라이브러리로 jQuery를 사용했습니다.
* chat.jsp 의 pollMessage 의 url을 조금 수정했습니다. - IE(7.0)에서 url을 캐싱하는 바람에 ajax request가 안가서요..
* Corund 님 설명대로 ChatMessageSenderListener 를 만들고 web.xml에서 등록했습니다.
* ChatMessageSenderListener는 MessageSender만들고 컨텍스트에 setAttribute합니다.
* BroadcasterServlet 의 init()에서 MessageSender를 getAttribute합니다.
* CometProcessor를 구현했더니.. getServletContext()가 null네요. 왜그럴까요??
* event()메소드 CometEvent.EventType.END 에 event.close() 한줄 추가 했습니다.
* ChatServlet 의 init()에서 MessageSender를 getAttribute합니다.
* 한글 깨지지 말라고 doPost()에 request.setCharacterEncoding("UTF-8"); 한줄 추가 했습니다.
* apache-tomcat-6.0.18 에서 테스트 했습니다.

이상 원글에서 수정한것들입니다.

BoarecasterServlet에서 CometEvent.EventType.ERROR 와 CometEvent.EventType.END 이벤트가 발생하면 event.close()이 실행되는데.. 여기서 response 는 상태코드 200을 갖고 스트림이 종료되된다. 이로인해 클라이언트측(chat.jsp)의 폴링메소드의 complete 가 실행되어 "롱폴링"이 일어나는 것이다.

CometEvent.EventType.END 는 MessageSender에서 각 클라이언트로 메세지 보내낸 후 response.flushBuffer();가 실행되면 발생한다.

Comet 타임아웃 설정
CometEvent.EventType.BEGIN 이벤트 발생하면 event.setTimeout(30 * 1000)와 같이 타임아웃을 설정할 수 있다. 타임아웃이 되면 CometEvent.EventType.ERROR를 발생시킨다.

참.. server.xml에서 아래 밑줄 잊지 마세요..
protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

http://localhost:8080/comet_tomcat/chat 접속해 보면..

No comments: