예제 #1
0
  protected void doDeliver(ServerSession sender, ServerMessage.Mutable mutable) {
    if (sender == this && !isBroadcastToPublisher()) return;

    ServerMessage message = null;
    if (mutable.isMeta()) {
      if (extendSendMeta(mutable)) message = mutable;
    } else {
      message = extendSendMessage(mutable);
    }

    if (message == null) return;

    _bayeux.freeze((Mutable) message);

    if (!_listeners.isEmpty()) {
      for (ServerSessionListener listener : _listeners) {
        if (listener instanceof MessageListener) {
          if (!notifyOnMessage((MessageListener) listener, sender, message)) return;
        }
      }
    }

    boolean wakeup;
    synchronized (getLock()) {
      if (!_listeners.isEmpty()) {
        for (ServerSessionListener listener : _listeners) {
          if (listener instanceof MaxQueueListener) {
            final int maxQueueSize = _maxQueue;
            if (maxQueueSize > 0 && _queue.size() > maxQueueSize) {
              if (!notifyQueueMaxed((MaxQueueListener) listener, this, _queue, sender, message))
                return;
            }
          }
        }
      }
      addMessage(message);
      if (!_listeners.isEmpty()) {
        for (ServerSessionListener listener : _listeners) {
          if (listener instanceof QueueListener)
            notifyQueued((QueueListener) listener, sender, message);
        }
      }
      wakeup = _batch == 0;
    }

    if (wakeup) {
      if (message.isLazy()) flushLazy(message);
      else flush();
    }
  }