I am trying to create a very simple Comet Servlet that will push Hello World subscribers a message:
@WebServlet("/ChatServlet") public class ChatServlet extends HttpServlet implements CometProcessor { private static final long serialVersionUID = 1L; private MessageSender messageSender = null; private static final Integer TIMEOUT = 60 * 1000; public void init(ServletConfig config) throws ServletException { messageSender = new MessageSender(); Thread messageSenderThread = new Thread(messageSender); messageSenderThread.setDaemon(true); messageSenderThread.start(); } public void destroy() {
and then my runnable looks like this:
public class MessageSender implements Runnable { protected boolean running = true; protected final List<String> messages = new ArrayList<String>(); private ServletResponse connection; public synchronized void setConnection(ServletResponse connection){ this.connection = connection; notify(); } @Override public void run() { while (running) { if (messages.size() == 0) { try { synchronized (messages) { messages.wait(); } } catch (InterruptedException e) {
now my cometd Dojo code is as follows:
<script src="dojo/dojo.js"></script> <script type="text/javascript"> dojo.require("dojox.cometd"); dojo.addOnLoad(function(){ dojox.cometd.init("ChatServlet"); dojox.cometd.subscribe("ChatServlet", window, "alertMessage"); }); function alertMessage(message) { alert("Message: " + message); } </script>
Now, when I download the client, I get the following error:
Begin for session: C898A372F1B1199C04CA308F715ABC36Nov 6, 2011 2:00:48 PM org.apache.catalina.core.StandardWrapperValve event SEVERE: Servlet.service() for servlet [com.vanilla.servlet.ChatServlet] in context with path [/Servlet3Comet] threw exception java.lang.UnsupportedOperationException: This servlet does not accept data at com.vanilla.servlet.ChatServlet.event(ChatServlet.java:75) Error for session: C898A372F1B1199C04CA308F715ABC36 End for session: C898A372F1B1199C04CA308F715ABC36
What am I doing wrong? Why does cometD subscription call CometEvent.EventType.READ ? Does anyone have a working example of a comet?
PS: I switched to Nio according to the configuration of Tomcat.
source share