Exemple #1
0
  public void event(CometEvent e) throws IOException, ServletException {
    HttpServletRequest request = e.getHttpServletRequest();
    HttpServletResponse response = e.getHttpServletResponse();
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html,charset=utf-8");
    int id = StringUtil.strToInt(request.getSession().getAttribute("userid").toString());

    if (e.getEventType() == EventType.BEGIN) {
      log("Begin for session: " + request.getSession(true).getId());
      request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT);
      PrintWriter out = response.getWriter();
      int t = mailcometDAO.qryUnreadMail(id);
      out.write(String.valueOf(t));
      out.flush();
    } else if (e.getEventType() == CometEvent.EventType.ERROR) {
      log("Error for session: " + request.getSession(true).getId());
      e.close();
    } else if (e.getEventType() == CometEvent.EventType.END) {
      log("End for session: " + request.getSession(true).getId());
      e.close();
    } else if (e.getEventType() == CometEvent.EventType.READ) {
      throw new UnsupportedOperationException("This servlet does not accept data");
    }
  }
  /**
   * When an event is received, it is processed accordingly. A post event will tell the servlet to
   * wait for the messages, if there are messages waiting, they will be transmitted. Any errors will
   * be handled.
   *
   * @param event - the Http event that occured
   * @throws IOException - thrown if there is a read/write error
   * @throws ServletException - thrown if a servlet error occurs
   */
  public void event(final CometEvent event) throws IOException, ServletException {
    final HttpServletRequest request = event.getHttpServletRequest();
    final QueueSession session =
        sessionProvider.getSession(
            request.getSession(), request.getHeader(ClientMessageBus.REMOTE_QUEUE_ID_HEADER));

    MessageQueue queue;
    switch (event.getEventType()) {
      case BEGIN:
        boolean post = "POST".equals(request.getMethod());
        if ((queue = getQueue(session, !post)) != null) {
          synchronized (activeEvents) {
            Set<CometEvent> events = activeEvents.get(session);

            if (post) {
              // do not pause incoming messages.
              break;
            } else if (queue.messagesWaiting()) {
              transmitMessages(event.getHttpServletResponse(), queue);
              event.close();
              break;
            }

            if (!queueToSession.containsKey(queue)) {
              queueToSession.put(queue, session);
            }

            if (events == null) {
              activeEvents.put(session, events = new HashSet<CometEvent>());
            }
            if (events.contains(event)) {
              break;
            } else {
              event.setTimeout(30000);
              events.add(event);
            }
          }
        } else {
          switch (getConnectionPhase(request)) {
            case CONNECTING:
            case DISCONNECTING:
              return;
          }

          sendDisconnectWithReason(
              event.getHttpServletResponse().getOutputStream(),
              "There is no queue associated with this session.");
        }
        break;

      case END:
        event.close();
        synchronized (activeEvents) {
          Set<CometEvent> evt = activeEvents.get(session);
          if (evt != null && !evt.remove(event)) {
            return;
          }
        }

        if ((queue = getQueue(session, false)) != null) {
          queue.heartBeat();
        } else {
          return;
        }

        break;

      case ERROR:
        log.error("An Error Occured: " + (event != null ? event.getEventSubType() : "<null>"));

        queue = getQueue(session, false);
        if (queue == null) {
          return;
        }

        synchronized (activeEvents) {
          Set<CometEvent> evt = activeEvents.get(session);
          if (evt != null && !evt.remove(event)) {
            return;
          }
        }

        if (event.getEventSubType() == CometEvent.EventSubType.TIMEOUT) {
          if (queue != null) queue.heartBeat();
        } else {
          if (queue != null) {
            queueToSession.remove(queue);
            service.getBus().closeQueue(session.getSessionId());
            activeEvents.remove(session);
          }
        }

        event.close();
        break;

      case READ:
        readInRequest(session, request, event.getHttpServletResponse());
        event.close();
    }
  }