package cn.jcenterhome.web.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PostHandler implements Runnable { private boolean running = true; private ArrayList<String> messages = new ArrayList<String>(); private Map<Integer, HttpServletResponse> connections = new HashMap<Integer, HttpServletResponse>(); private static PostHandler instance = new PostHandler(); private Integer toUid = 0; private PostHandler() { } public static PostHandler getInstance() { return instance; } public void stop() { running = false; } public void send(int toUid, String message) { synchronized (messages) { synchronized(this.toUid) { this.toUid = toUid; } messages.add("<script type=\"text/javascript\">comet.showServerData('"+message+"')</script>"); messages.notify(); } } public Map<Integer, HttpServletResponse> getConnections() { return connections; } public void run() { while (running) { if (messages.size() == 0) { try { synchronized (messages) { messages.wait(); } } catch (InterruptedException e) { } } synchronized (connections) { String[] pendingMessages = null; int pendingToUid = 0; synchronized (messages) { pendingMessages = messages.toArray(new String[0]); messages.clear(); synchronized(this.toUid) { pendingToUid = this.toUid; this.toUid = 0; } } try { HttpServletResponse connection = connections.get(pendingToUid); if(connection != null) { PrintWriter writer = connection.getWriter(); writer.println(pendingMessages[0]); writer.flush(); } } catch (IOException e) { } } } } }