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

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


            case ConnectToQueue: {
              List<Message> deferred = null;
              synchronized (messageQueues) {
                if (messageQueues.containsKey(session)) {
                  final MessageQueue q = messageQueues.get(session);
                  synchronized (q) {
                    if (deferredQueue.containsKey(q)) {
                      deferred = deferredQueue.remove(q);
                    }
                  }

                  messageQueues.get(session).stopQueue();
                }

                queue = new MessageQueueImpl(transmissionbuffer, session);

                addQueue(session, queue);

                if (deferred != null) {
                  deferredQueue.put(queue, deferred);
                }

                remoteSubscribe(session, queue, BuiltInServices.ClientBus.name());
              }

              if (isMonitor()) {
                busMonitor.notifyQueueAttached(session.getSessionId(), queue);
              }

              createConversation(message)
                  .toSubject(BuiltInServices.ClientBus.name())
                  .command(BusCommands.RemoteSubscribe)
                  .with(MessageParts.SubjectsList, new HashSet(globalSubscriptions))
                  .with(MessageParts.PriorityProcessing, "1")
                  .noErrorHandling().sendNowWith(ServerMessageBusImpl.this, false);

              final Message msg = ConversationMessage.create(message)
                  .toSubject(BuiltInServices.ClientBus.name())
                  .command(BusCommands.CapabilitiesNotice);

              final StringBuilder capabilitiesBuffer = new StringBuilder(25);

              final boolean first;
              if (ErraiServiceConfigurator.LONG_POLLING) {
                capabilitiesBuffer.append(Capabilities.LongPollAvailable.name());
                first = false;
              }
              else {
                capabilitiesBuffer.append(Capabilities.NoLongPollAvailable.name());
                first = false;
                msg.set(MessageParts.PollFrequency, ErraiServiceConfigurator.HOSTED_MODE_TESTING ? 50 : 250);
              }

              if (webSocketServer || webSocketServlet) {
                if (!first) {
                  capabilitiesBuffer.append(',');
                }
                capabilitiesBuffer.append(Capabilities.WebSockets.name());
                /**
                 * Advertise where the client can find a websocket.
                 */

                final String webSocketURL;

                final HttpServletRequest request = message.getResource(HttpServletRequest.class, HttpServletRequest.class.getName());

                if (webSocketServlet) {
                  webSocketURL = "ws://" + request.getHeader("Host") + webSocketPath;
                }
                else {
                  webSocketURL = "ws://" + request.getServerName() + ":" + webSocketPort + webSocketPath;
                }
                msg.set(MessageParts.WebSocketURL, webSocketURL);
                msg.set(MessageParts.WebSocketToken, WebSocketTokenManager.getNewOneTimeToken(session));
              }

              msg.set(MessageParts.CapabilitiesFlags, capabilitiesBuffer.toString());

              send(msg, false);

              createConversation(message)
                  .toSubject(BuiltInServices.ClientBus.name())
                  .command(BusCommands.FinishStateSync)
                  .with(MessageParts.ConnectionSessionKey, queue.getSession().getSessionId())
                  .noErrorHandling().sendNowWith(ServerMessageBusImpl.this, false);

              break;
            }

            case WebsocketChannelVerify:
              if (message.hasPart(MessageParts.WebSocketToken)) {
                if (verifyOneTimeToken(session, message.get(String.class, MessageParts.WebSocketToken))) {

                  final LocalContext localContext = LocalContext.get(session);

                  localContext.setAttribute(WebSocketServerHandler.SESSION_ATTR_WS_STATUS,
                      WebSocketServerHandler.WEBSOCKET_ACTIVE);

                  createConversation(message)
                      .toSubject(BuiltInServices.ClientBus.name())
                      .command(BusCommands.WebsocketChannelOpen)
                      .done().sendNowWith(ServerMessageBusImpl.this, false);
                }
              }
              break;
          }

        }
        catch (Throwable t) {
          t.printStackTrace();
        }
      }
    });

    addSubscribeListener(new SubscribeListener() {
      @Override
      public void onSubscribe(final SubscriptionEvent event) {
        if (event.isLocalOnly() || event.isRemote() || event.getSubject().startsWith("local:")) return;

        MessageBuilder.createMessage()
                .toSubject(BuiltInServices.ClientBus.name())
                .command(BusCommands.RemoteSubscribe)
                .with(MessageParts.Subject, event.getSubject())
                .noErrorHandling().sendGlobalWith(ServerMessageBusImpl.this);

      }
    });

    addUnsubscribeListener(new UnsubscribeListener() {
      @Override
      public void onUnsubscribe(final SubscriptionEvent event) {
        if (event.isLocalOnly() || event.isRemote() || event.getSubject().startsWith("local:")) return;
        if (messageQueues.isEmpty()) return;

        MessageBuilder.createMessage()
                .toSubject(BuiltInServices.ClientBus.name())
                .command(BusCommands.RemoteUnsubscribe)
                .with(MessageParts.Subject, event.getSubject())
                .noErrorHandling().sendGlobalWith(ServerMessageBusImpl.this);
      }
    });

    scheduler.scheduleAtFixedRate(new Runnable() {
      int runCount = 0;
      boolean lastWasEmpty = false;

      @Override
      public void run() {
        runCount++;
        boolean houseKeepingPerformed = false;
        final List<MessageQueue> endSessions = new LinkedList<MessageQueue>();

        int paged = 0, killed = 0;

        while (!houseKeepingPerformed) {
          try {
            final Iterator<MessageQueue> iter = ServerMessageBusImpl.this.messageQueues.values().iterator();
            MessageQueue q;
            while (iter.hasNext()) {
              if ((q = iter.next()).isStale()) {
                iter.remove();
                endSessions.add(q);
                killed++;
              }
              else if (q.isDowngradeCandidate()) {
                if (!q.pageWaitingToDisk()) {
                  paged++;
                }
              }
            }

View Full Code Here


    message.commit();
    if (!message.hasResource(Resources.Session.name())) {
      handleMessageDeliveryFailure(this, message, "cannot automatically route message. no session contained in message.", null, false);
    }

    final MessageQueue queue = getQueue(getSession(message));

    if (queue == null) {
      handleMessageDeliveryFailure(this, message, "cannot automatically route message. no session contained in message.", null, false);
    }
View Full Code Here

  private static QueueSession getSession(final Message message) {
    return message.getResource(QueueSession.class, Resources.Session.name());
  }

  private MessageQueue getQueueByMessage(final Message message) {
    final MessageQueue queue = getQueue(getSession(message));
    if (queue == null) {
      throw new QueueUnavailableException("no queue available to send. (queue or session may have expired): " +
              "(session id: " + getSession(message).getSessionId() + ")");
    }
    else {
View Full Code Here

        final String sessId = message.get(String.class, SessId);
        if (sessId == null) {
          serverMessageBus.sendGlobal(forwardMessage);
        }
        else {
          final MessageQueue messageQueue;

          try {
            messageQueue = serverMessageBus.getQueueBySession(sessId);
          }
          catch (QueueUnavailableException e) {
            final org.jgroups.Message jgroupsMessage
                = message.getResource(org.jgroups.Message.class, JGROUPS_MESSAGE_RESOURCE);

            final String messageId = message.get(String.class, MessageId);
            final Message invalidRoute = createInvalidRouteMessage(sessId, forwardMessage.getSubject(), messageId);

            try {
              jchannel.send(jgroupsMessage.getSrc(), ErraiProtocol.encodePayload(invalidRoute.getParts()));
            }
            catch (Exception e2) {
              e2.printStackTrace();
            }
            return;
          }

          // otherwise route it directly to the client.
          forwardMessage.setResource(Resources.Session.name(), messageQueue.getSession());
          serverMessageBus.send(forwardMessage);
        }
      }
      break;
    }
View Full Code Here

      }
      else {
        prepareCometPoll(httpServletResponse);
      }

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

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

        sendDisconnectDueToSessionExpiry(httpServletResponse);
        return;
      }
      queue.heartBeat();
     
      final ServletOutputStream outputStream = httpServletResponse.getOutputStream();
      if (sse) {
        while (!queue.isStale()) {
          try {
            prepareSSEContinue(httpServletResponse);
            queue.poll(TimeUnit.MILLISECONDS, getSSETimeout(), new OutputStreamWriteAdapter(outputStream));
            outputStream.write(SSE_TERMINATION_BYTES);
            outputStream.flush();
            queue.heartBeat();
          }
          catch (IOException e) {
            log.debug("SSE problem when polling for new messages", e);
            outputStream.close();
            return;
          }
        }
      }
      else if (wait) {
        queue.poll(TimeUnit.MILLISECONDS, getLongPollTimeout(), new OutputStreamWriteAdapter(outputStream));
      }
      else {
        queue.poll(new OutputStreamWriteAdapter(outputStream));
      }
    }
    catch (final IOException io) {
      log.debug("Problem when polling for new messages", io);
    }
View Full Code Here

  @Override
  protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException {
    final QueueSession session = sessionProvider.createOrGetSession(request.getSession(), getClientId(request));
    session.setAttribute("NoSSE", Boolean.TRUE);
   
    final MessageQueue queue = service.getBus().getQueue(session);
    if (queue == null) {
      switch (getConnectionPhase(request)) {
        case CONNECTING:
        case DISCONNECTING:
          return;
      }
      try {
        sendDisconnectDueToSessionExpiry(response);
      }
      catch (IOException ioe) {
        log.debug("Failed to inform client that session expired", ioe);
      }
      return;
    }
    queue.heartBeat();

   
    final AsyncContext asyncContext = request.startAsync();
    asyncContext.setTimeout(60000);
    queue.setTimeout(65000);
   
    asyncContext.addListener(new AsyncListener() {
        @Override
        public void onComplete(final AsyncEvent event) throws IOException {
          clearActivationCallback(queue);
        }

        @Override
        public void onTimeout(final AsyncEvent event) throws IOException {
          clearActivationCallback(queue);
          asyncContext.complete();
        }

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

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

    synchronized (queue.getActivationLock()) {
      if (queue.messagesWaiting()) {
        try {
          queue.poll(new OutputStreamWriteAdapter(asyncContext.getResponse().getOutputStream()));
          asyncContext.complete();
        }
        catch(IOException ioe) {
          log.debug("Problem when polling for new messages", ioe);      
        }
        return;
      }

      queue.setActivationCallback(new QueueActivationCallback() {
        @Override
        public void activate(final MessageQueue queue) {
          try {
            queue.poll(new OutputStreamWriteAdapter(asyncContext.getResponse().getOutputStream()));
            queue.setActivationCallback(null);
            queue.heartBeat();
          }
          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

      catch (QueueUnavailableException e) {
        sendDisconnectDueToSessionExpiry(response);
        return;
      }

      final MessageQueue queue = service.getBus().getQueue(session);
      if (queue != null) {
        if (shouldWait(request)) {
          doGet(request, response);
        }
        else {
          queue.poll(new OutputStreamWriteAdapter(response.getOutputStream()));
        }
      }
    }
    catch (final IOException ioe) {
      log.debug("Problem when storing message", ioe);
View Full Code Here

          if (localCometSession.hasAttribute(WebSocketServerHandler.SESSION_ATTR_WS_STATUS) &&
                  WebSocketServerHandler.WEBSOCKET_ACTIVE.equals(localCometSession.getAttribute(String.class, WebSocketServerHandler.SESSION_ATTR_WS_STATUS))) {

            // set the session queue into direct channel mode.

            final MessageQueue queue = service.getBus().getQueue(cometSession);
            queue.setDeliveryHandler(DirectDeliveryHandler.createFor(new SimpleEventChannelWrapped(socket)));

            localSessionContext.setAttribute(WEBSOCKET_SESSION_ALIAS, cometSession);
            cometSession.removeAttribute(WebSocketServerHandler.SESSION_ATTR_WS_STATUS);

            return;
View Full Code Here

  private void pollForMessages(QueueSession session, HttpServletRequest httpServletRequest,
          HttpServletResponse httpServletResponse, boolean wait) {
   
    try {
      final MessageQueue queue = service.getBus().getQueue(session);
      if (queue == null) {
        switch (getConnectionPhase(httpServletRequest)) {
          case CONNECTING:
          case DISCONNECTING:
            return;
        }

        sendDisconnectDueToSessionExpiry(httpServletResponse);

        return;
      }
      queue.heartBeat();

      if (wait) {
        synchronized (queue.getActivationLock()) {
          final Continuation cont = ContinuationSupport.getContinuation(httpServletRequest, queue);

          if (!cont.isResumed() && !queue.messagesWaiting()) {
            queue.setActivationCallback(new JettyQueueActivationCallback(cont));
            if (cont.suspend(30 * 1000)) {
              return;
            }
          }
        }
View Full Code Here

          final LocalContext localContext = LocalContext.get(session);

          if (localContext.hasAttribute(SESSION_ATTR_WS_STATUS) &&
              WEBSOCKET_ACTIVE.equals(localContext.getAttribute(String.class, SESSION_ATTR_WS_STATUS))) {

            final MessageQueue queueBySession = svc.getBus().getQueueBySession(sessionKey);
            queueBySession.setDeliveryHandler(DirectDeliveryHandler.createFor(new NettyQueueChannel(ctx.channel())));

            // open the channel
            activeChannels.put(ctx.channel(), session);
            ctx.channel().closeFuture().addListener(new ChannelFutureListener() {
              @Override
              public void operationComplete(final ChannelFuture channelFuture) throws Exception {
                activeChannels.remove(ctx.channel());
                queueBySession.setDeliveryHandlerToDefault();
              }
            });

            // set the session queue into direct channel mode.
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.