Package org.jboss.errai.bus.server.api

Examples of org.jboss.errai.bus.server.api.MessageQueue


      httpServletResponse.setHeader("Cache-Control", "no-cache");
      httpServletResponse.setHeader("Pragma", "no-cache");
      httpServletResponse.setHeader("Expires", "-1");
      httpServletResponse.setContentType("application/json");

      final MessageQueue queue = service.getBus().getQueue(session);

      if (queue == null) {
        switch (getConnectionPhase(httpServletRequest)) {
          case CONNECTING:
          case DISCONNECTING:
            return;
        }

        sendDisconnectDueToSessionExpiry(httpServletResponse.getOutputStream());

        return;
      }

      queue.heartBeat();

      queue.poll(wait, httpServletResponse.getOutputStream());

      httpServletResponse.getOutputStream().close();
    }
    catch (final Throwable t) {
      t.printStackTrace();
View Full Code Here


  private void pollForMessages(QueueSession session, HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse) throws IOException {

    try {
      final MessageQueue queue = service.getBus().getQueue(session);

      if (queue == null) {
        switch (getConnectionPhase(httpServletRequest)) {
          case CONNECTING:
          case DISCONNECTING:
            return;
        }

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

      synchronized (queue) {
        if (context == null)
          context = createCometContext(httpServletRequest.getSession().getId());

        final ReflectorCometHandler handler = new ReflectorCometHandler(true);
        context.addCometHandler(handler);

        if (!queue.messagesWaiting()) {
          queue.setActivationCallback(new QueueActivationCallback() {
            public void activate(MessageQueue queue) {
              queue.setActivationCallback(null);
              context.resumeCometHandler(handler);
              try {
                context.notify(null, CometEvent.NOTIFY, handler);
              }
              catch (IOException e) {
                // Should never get here
              }
            }
          });

          if (!queue.messagesWaiting()) {
            context.setExpirationDelay(45 * 1000);
          }
        }
        else {
          queue.setActivationCallback(null);
        }

        pollQueue(queue, httpServletRequest, httpServletResponse);
      }
    }
View Full Code Here

  private void pollForMessages(QueueSession session, HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse, boolean wait) throws IOException {
    final OutputStream stream = httpServletResponse.getOutputStream();

    try {
      final MessageQueue queue = service.getBus().getQueue(session);

      if (queue == null) {
        switch (getConnectionPhase(httpServletRequest)) {
          case CONNECTING:
          case DISCONNECTING:
            return;
        }

        sendDisconnectDueToSessionExpiry(httpServletResponse.getOutputStream());

        return;
      }

      synchronized (queue.getActivationLock()) {
        if (wait) {
          final Continuation cont = ContinuationSupport.getContinuation(httpServletRequest, queue);
          if (!cont.isResumed() && !queue.messagesWaiting()) {
            queue.setActivationCallback(new JettyQueueActivationCallback(cont));
            cont.suspend(45 * 1000);
            return;
          }
        }

View Full Code Here

  }

  private void pollForMessages(QueueSession session, HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse) throws IOException {
    try {
      final MessageQueue queue = service.getBus().getQueue(session);

      if (queue == null) {
        switch (getConnectionPhase(httpServletRequest)) {
          case CONNECTING:
          case DISCONNECTING:
View Full Code Here

   */
  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());
View Full Code Here

      else {
        return 0;
      }
    }
    catch (IOException e) {
      MessageQueue queue = service.getBus().getQueue(session);
      if (queue != null) {
        queue.stopQueue();
      }
      e.printStackTrace();
      return -1;
    }
  }
View Full Code Here

    }
  }


  private MessageQueue getQueue(QueueSession session, boolean pause) {
    MessageQueue queue = service.getBus().getQueue(session);
    if (pause && queue != null && queue.getActivationCallback() == null) {
      queue.setActivationCallback(new QueueActivationCallback() {
        volatile boolean resumed = false;

        public void activate(MessageQueue queue) {
          //      log.info("Resume...");
          if (resumed) {
            return;
          }
          resumed = true;
          queue.setActivationCallback(null);

          try {
            Set<CometEvent> activeSessEvents;
            QueueSession session;
            session = queueToSession.get(queue);
            if (session == null) {
              log.error("Could not resume: No session.");
              queue.stopQueue();
              return;
            }

            activeSessEvents = activeEvents.get(queueToSession.get(queue));
View Full Code Here

   */
  public void event(final HttpEvent event) throws IOException, ServletException {
    final HttpServletRequest request = event.getHttpServletRequest();
    final QueueSession session = sessionProvider.getSession(request.getSession(), request.getHeader("RemoteQueueID"));

    MessageQueue queue;
    switch (event.getType()) {
      case BEGIN:
        boolean post = "POST".equals(request.getMethod());
        queue = getQueue(session, !post);
        if (queue == null) {
          switch (getConnectionPhase(request)) {
            case CONNECTING:
            case DISCONNECTING:
              return;
          }

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

        synchronized (activeEvents) {

          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);
          }


          Set<HttpEvent> events = activeEvents.get(session);
          if (events == null) {
            activeEvents.put(session, events = new LinkedHashSet<HttpEvent>());
          }

          if (events.contains(event)) {
            event.close();
          }
          else {
            events.add(event);
          }
        }
        break;


      case END:
        if ((queue = getQueue(session, false)) != null) {
          queue.heartBeat();
        }

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

        event.close();
        break;

      case EOF:
        event.close();
        break;

      case TIMEOUT:
      case ERROR:
        queue = getQueue(session, false);

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

        if (event.getType() == HttpEvent.EventType.TIMEOUT) {
          if (queue != null) queue.heartBeat();
        }
        else {
          if (queue != null) {
            queueToSession.remove(queue);
            service.getBus().closeQueue(session.getSessionId());
View Full Code Here

    }
  }


  private MessageQueue getQueue(QueueSession session, boolean post) {
    MessageQueue queue = service.getBus().getQueue(session);

    if (post && queue != null && queue.getActivationCallback() == null) {
      queue.setActivationCallback(new QueueActivationCallback() {
        boolean resumed = false;

        public void activate(MessageQueue queue) {
          if (resumed) {
            //            log.info("Blocking");
            return;
          }
          resumed = true;
          queue.setActivationCallback(null);

          //     log.info("Attempt to resume queue: " + queue.hashCode());
          try {
            Set<HttpEvent> activeSessEvents;
            QueueSession session;
View Full Code Here

  @Override
  protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
      IOException {

    final QueueSession session = sessionProvider.createOrGetSession(request.getSession(), getClientId(request));
    final MessageQueue queue = service.getBus().getQueue(session);

    if (queue == null) {
      switch (getConnectionPhase(request)) {
        case CONNECTING:
        case DISCONNECTING:
          return;
      }
      sendDisconnectDueToSessionExpiry(response);
      return;
    }

    queue.heartBeat();

    final OutputStreamWriteAdapter writer;

    if (isSSERequest(request)) {
      final AsyncContext asyncContext = request.startAsync();
      asyncContext.setTimeout(getSSETimeout());
      queue.setTimeout(getSSETimeout() + 5000);
     
      final HttpServletResponse asynResponse = (HttpServletResponse) asyncContext.getResponse();
      prepareSSE(asynResponse);
      prepareSSEContinue(asynResponse);
      asynResponse.getOutputStream().flush();
      writer = new OutputStreamWriteAdapter(asynResponse.getOutputStream());

      asyncContext.addListener(new AsyncListener() {
        @Override
        public void onComplete(final AsyncEvent event) throws IOException {
          synchronized (queue.getActivationLock()) {
            queue.setActivationCallback(null);
            asyncContext.complete();
          }
        }

        @Override
        public void onTimeout(final AsyncEvent event) throws IOException {
          onComplete(event);
        }

        @Override
        public void onError(final AsyncEvent event) throws IOException {
          queue.setActivationCallback(null);
        }

        @Override
        public void onStartAsync(final AsyncEvent event) throws IOException {
        }
      });

      synchronized (queue.getActivationLock()) {
        if (queue.messagesWaiting()) {
          queue.poll(writer);
          writer.write(SSE_TERMINATION_BYTES);
          writer.flush();
          return;
        }

        queue.setActivationCallback(new QueueActivationCallback() {
          @Override
          public void activate(final MessageQueue queue) {
            try {
              queue.poll(writer);

              writer.write(SSE_TERMINATION_BYTES);

              queue.heartBeat();
              writer.flush();

              prepareSSEContinue(asynResponse);
            }
            catch (IOException e) {
              log.debug("Closing queue with id: " + queue.getSession().getSessionId() + " due to IOException", e);
              queue.stopQueue();
            }
            catch (final Throwable t) {
              try {
                writeExceptionToOutputStream((HttpServletResponse) asyncContext.getResponse(), t);
              }
              catch (Throwable t2) {
                log.debug("Failed to write exception to dead client", t2);
              }
            }
          }
        });
      }
    }

    else {
      final AsyncContext asyncContext = request.startAsync();
      asyncContext.setTimeout(60000);
      queue.setTimeout(65000);
      writer = new OutputStreamWriteAdapter(asyncContext.getResponse().getOutputStream());

      asyncContext.addListener(new AsyncListener() {
          @Override
          public void onComplete(final AsyncEvent event) throws IOException {
            synchronized (queue.getActivationLock()) {
              queue.setActivationCallback(null);
              asyncContext.complete();
            }
          }

          @Override
          public void onTimeout(final AsyncEvent event) throws IOException {
            onComplete(event);
          }

          @Override
          public void onError(final AsyncEvent event) throws IOException {
            queue.setActivationCallback(null);
          }

          @Override
          public void onStartAsync(final AsyncEvent event) throws IOException {
          }
        });

      synchronized (queue.getActivationLock()) {
        if (queue.messagesWaiting()) {
          queue.poll(writer);
          asyncContext.complete();
          return;
        }

        queue.setActivationCallback(new QueueActivationCallback() {
          @Override
          public void activate(final MessageQueue queue) {
            try {
              queue.poll(writer);
              queue.setActivationCallback(null);

              queue.heartBeat();
              writer.flush();
            }
            catch (IOException e) {
              log.debug("Closing queue with id: " + queue.getSession().getSessionId() + " due to IOException", e);
             
            }
            catch (final Throwable t) {
              try {
                writeExceptionToOutputStream((HttpServletResponse) asyncContext.getResponse(), t);
View Full Code Here

TOP

Related Classes of org.jboss.errai.bus.server.api.MessageQueue

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.