태그 : comet
2008/08/01 자바 서블릿 컨테이너의 Comet 지원 3 - Resin
2008/07/30 자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat [1]
2008/07/29 Comet 에 대하여 [4]
2008/07/30 자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat [1]
2008/07/29 Comet 에 대하여 [4]
public interface CometServlet extends Servlet {
boolean service(ServletRequest request, ServletResponse response,
CometController controller) throws ServletException, IOException;
boolean resume(ServletRequest request, ServletResponse response,
CometController controller) throws ServletException, IOException;
}
BroadcasterServlet.java
...
@Override
public boolean service(ServletRequest request, ServletResponse response,
CometController controller) throws ServletException, IOException {
HttpServletResponse res = (HttpServletResponse) response;
res.setContentType("text/html; charset=utf-8");
messageSender.addSession(controller);
return true;
}
@Override
public boolean resume(ServletRequest request, ServletResponse response,
CometController controller) throws ServletException, IOException {
messageSender.removeSession(controller);
String message = (String) controller.getAttribute("message");
HttpServletResponse res = (HttpServletResponse) response;
PrintWriter out = res.getWriter();
out.println(message);
res.flushBuffer();
return false;
}
...
MessageSender.java
public class MessageSender implements Runnable {
private final BlockingQueue<String> messages =
new LinkedBlockingQueue<String>();
private final Set<CometController> sessions =
new CopyOnWriteArraySet<CometController>();
private volatile boolean running = true;
public void stop() {
this.running = false;
}
public void sendMessage(String message) {
try {
messages.put(message);
} catch (InterruptedException ignore) {
// ignore
}
}
public void addSession(CometController controller) {
sessions.add(controller);
}
public void removeSession(CometController controller) {
sessions.remove(controller);
}
@Override
public void run() {
while (running) {
String message = null;
try {
message = messages.take();
} catch (InterruptedException ignore) {
// ignore
}
for (CometController controller : controllers) {
controller.setAttribute("message", message);
controller.wake();
}
}
}
}
# by | 2008/08/01 09:35 | 트랙백 | 덧글(0)
<!-- 기존 설정. 아래와 같이 바꾼다.
<connector connectiontimeout="20000" port="8080" protocol="HTTP/1.1" redirectport="8443"/>
-->
<connector connectiontimeout="20000" port="8000">
protocol="org.apache.coyote.http11.Http11NioProtocol" useComet="true" redirectPort="8443"/>
public class BroadcasterServlet extends HttpServlet implements CometProcessor {
...
@Override
public void event(CometEvent event) throws ServletException, IOException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
String sessionId = request.getSessionId();
if (CometEvent.EventType.BEGIN == event.getEventType()) {
// 요청을 최초로 처리할 때 호출됨.
response.setContentType("text/html; charset=utf-8");
messageSender.addSession(sessionId, event);
} else if (CometEvent.EventType.ERROR == event.getEventType()) {
// IO 에러가 발생했을 때.
messageSender.removeSession(sessionId);
event.close(); // 요청 처리 완료.
} else if (CometEvent.EventType.END == event.getEventType()) {
// 요청 처리가 완료되었을 때
log("End event");
} else if (CometEvent.EventType.READ == event.getEventType()) {
log("Read event");
}
}
...
}
MessageSender.java
public class MessageSender implements Runnable {
private volatile boolean running = true;
private final BlockingQueue<String> messages =
new LinkedBlockingQueue<String>();
private final Map<String, CometEvent> sessions =
new ConcurrentHashMap<String, CometEvent>();
private final ExecutorService executor = Executors.newFixedThreadPool(5);
public void send(String message) {
try {
messages.put(message);
} catch (InterruptedException ignore) {
// ignore
}
}
public void addSession(String id, CometEvent event) {
sessions.put(id, event);
}
public void removeSession(String id) {
sessions.remove(id);
}
public void stop() {
this.running = false;
this.executor.shutdown();
}
@Override
public void run() {
while (running) {
String message = null;
try {
message = messages.take();
} catch (InterruptedException ignore) {
// ignore
}
for (String id : sessions.keySet()) {
executor.submit(new Task(id, message));
}
}
}
private class Task implements Runnable {
private String sessionId;
private String message;
public Task(String id, String msg) {
sessionId = id;
message = msg;
}
public void run() {
CometEvent event = sessions.get(sessionId);
if (null == event) {
return;
}
HttpServletResponse response = event.getHttpServletResponse();
PrintWriter out = null;
try {
out = response.getWriter();
out.println(message);
out.flush();
response.flushBuffer();
} catch (IOException naive) {
naive.printStackTrace();
} finally {
try { out.close(); } catch (Exception ignore) {}
try { event.close(); } catch (Exception ignore) {}
sessions.remove(sessionId);
}
}
}
}
# by | 2008/07/30 19:31 | 트랙백(1) | 핑백(1) | 덧글(1)
# by | 2008/07/29 19:32 | 트랙백(2) | 핑백(3) | 덧글(4)
◀ 이전 페이지다음 페이지 ▶