@Override
  public AtmosphereResource notifyListeners(AtmosphereResourceEvent event) {
    if (listeners.size() > 0) {
      logger.trace("Invoking listener with {}", event);
    } else {
      return this;
    }

    Action oldAction = action;
    try {
      if (event.isClosedByApplication()) {
        onClose(event);
      } else if (event.isCancelled() || event.isClosedByClient()) {
        if (!disconnected.getAndSet(true)) {
          onDisconnect(event);
        }
      } else if (event.isResuming() || event.isResumedOnTimeout()) {
        onResume(event);
      } else if (!isSuspendEvent.getAndSet(true) && event.isSuspended()) {
        onSuspend(event);
      } else if (event.throwable() != null) {
        onThrowable(event);
      } else {
        onBroadcast(event);
      }

      if (oldAction.type() != action.type()) {
        action().type(Action.TYPE.CREATED);
      }
    } catch (Throwable t) {
      logger.debug("Listener error {}", t);
      AtmosphereResourceEventImpl.class.cast(event).setThrowable(t);
      try {
        onThrowable(event);
      } catch (Throwable t2) {
        logger.warn("Listener error {}", t2);
      }
    }
    return this;
  }