Search in sources :

Example 6 with AtmosphereResource

use of org.atmosphere.cpr.AtmosphereResource in project atmosphere by Atmosphere.

the class IdleResourceInterceptor method idleResources.

protected void idleResources() {
    if (logger.isTraceEnabled()) {
        logger.trace("{} monitoring {} AtmosphereResources", getClass().getSimpleName(), config.resourcesFactory().findAll().size());
    }
    for (AtmosphereResource r : config.resourcesFactory().findAll()) {
        if (Utils.pollableTransport(r.transport())) {
            continue;
        }
        AtmosphereRequest req = AtmosphereResourceImpl.class.cast(r).getRequest(false);
        try {
            if (req.getAttribute(MAX_INACTIVE) == null) {
                logger.warn("Invalid state {}", r);
                r.removeFromAllBroadcasters();
                config.resourcesFactory().unRegisterUuidForFindCandidate(r);
                continue;
            }
            long l = (Long) req.getAttribute(MAX_INACTIVE);
            if (logger.isTraceEnabled() && l > 0) {
                logger.trace("Expiring {} in {}", r.uuid(), System.currentTimeMillis() - l);
            }
            if (l > 0 && System.currentTimeMillis() - l > maxInactiveTime) {
                try {
                    req.setAttribute(MAX_INACTIVE, (long) -1);
                    logger.debug("IdleResourceInterceptor disconnecting {}", r);
                    Future<?> f = (Future<?>) req.getAttribute(HeartbeatInterceptor.HEARTBEAT_FUTURE);
                    if (f != null)
                        f.cancel(false);
                    req.removeAttribute(HeartbeatInterceptor.HEARTBEAT_FUTURE);
                    WebSocket webSocket = AtmosphereResourceImpl.class.cast(r).webSocket();
                    if (webSocket != null) {
                        webSocket.close();
                    } else {
                        AsynchronousProcessor.class.cast(config.framework().getAsyncSupport()).endRequest(AtmosphereResourceImpl.class.cast(r), true);
                    }
                } finally {
                    r.removeFromAllBroadcasters();
                    config.resourcesFactory().unRegisterUuidForFindCandidate(r);
                }
            }
        } catch (Throwable e) {
            logger.warn("IdleResourceInterceptor", e);
        }
    }
}
Also used : AtmosphereRequest(org.atmosphere.cpr.AtmosphereRequest) AtmosphereResource(org.atmosphere.cpr.AtmosphereResource) AsynchronousProcessor(org.atmosphere.cpr.AsynchronousProcessor) Future(java.util.concurrent.Future) AtmosphereResourceImpl(org.atmosphere.cpr.AtmosphereResourceImpl) WebSocket(org.atmosphere.websocket.WebSocket)

Example 7 with AtmosphereResource

use of org.atmosphere.cpr.AtmosphereResource in project atmosphere by Atmosphere.

the class DefaultWebSocketProcessor method handleException.

private void handleException(Exception ex, WebSocket webSocket, WebSocketHandler webSocketHandler) {
    logger.error("", ex);
    AtmosphereResource r = webSocket.resource();
    if (r != null) {
        webSocketHandler.onError(webSocket, new WebSocketException(ex, new AtmosphereResponseImpl.Builder().request(r != null ? AtmosphereResourceImpl.class.cast(r).getRequest(false) : null).status(500).statusMessage("Server Error").build()));
    }
}
Also used : AtmosphereResource(org.atmosphere.cpr.AtmosphereResource)

Example 8 with AtmosphereResource

use of org.atmosphere.cpr.AtmosphereResource in project atmosphere by Atmosphere.

the class DefaultWebSocketProcessor method open.

@Override
public final void open(final WebSocket webSocket, final AtmosphereRequest request, final AtmosphereResponse response) throws IOException {
    if (framework.isDestroyed())
        return;
    // TODO: Fix this. Instead add an Interceptor.
    if (framework.getAtmosphereConfig().handlers().isEmpty()) {
        synchronized (framework) {
            if (handlers.isEmpty()) {
                logger.warn("No AtmosphereHandler or WebSocketHandler installed. Adding a default one.");
            }
            framework.addAtmosphereHandler(ROOT_MASTER, REFLECTOR_ATMOSPHEREHANDLER);
        }
    }
    request.headers(configureHeader(request)).setAttribute(WebSocket.WEBSOCKET_SUSPEND, true);
    AtmosphereResource r = framework.atmosphereFactory().create(framework.getAtmosphereConfig(), response, framework.getAsyncSupport());
    boolean cleanUpAfterDisconnect = false;
    try {
        request.setAttribute(INJECTED_ATMOSPHERE_RESOURCE, r);
        request.setAttribute(SUSPENDED_ATMOSPHERE_RESOURCE_UUID, r.uuid());
        if (Utils.firefoxWebSocketEnabled(request)) {
            request.setAttribute("firefox", "true");
        }
        AtmosphereResourceImpl.class.cast(r).webSocket(webSocket);
        webSocket.resource(r);
        webSocketProtocol.onOpen(webSocket);
        WebSocketHandler proxy = null;
        if (!handlers.isEmpty()) {
            WebSocketHandlerProxy handler = mapper.map(request, handlers);
            if (handler == null) {
                logger.debug("No WebSocketHandler maps request for {} with mapping {}", request.getRequestURI(), handlers);
                throw new AtmosphereMappingException("No AtmosphereHandler maps request for " + request.getRequestURI());
            }
            proxy = postProcessMapping(webSocket, request, handler);
        }
        dispatch(webSocket, request, response);
        if (proxy != null) {
            webSocket.webSocketHandler(proxy).resource().suspend(-1);
            proxy.onOpen(webSocket);
        }
        request.removeAttribute(INJECTED_ATMOSPHERE_RESOURCE);
        // Resource can be null if the client disconnect.
        if (webSocket.resource() != null) {
            final Action action = ((AtmosphereResourceImpl) webSocket.resource()).action();
            if (action.timeout() != -1 && !framework.getAsyncSupport().getContainerName().contains("Netty")) {
                final AtomicReference<Future<?>> f = new AtomicReference();
                f.set(scheduler.scheduleAtFixedRate(new Runnable() {

                    @Override
                    public void run() {
                        if (WebSocket.class.isAssignableFrom(webSocket.getClass()) && System.currentTimeMillis() - WebSocket.class.cast(webSocket).lastWriteTimeStampInMilliseconds() > action.timeout()) {
                            asynchronousProcessor.endRequest(((AtmosphereResourceImpl) webSocket.resource()), false);
                            f.get().cancel(true);
                        }
                    }
                }, action.timeout(), action.timeout(), TimeUnit.MILLISECONDS));
            }
        } else {
            logger.warn("AtmosphereResource was null");
            cleanUpAfterDisconnect = true;
        }
        notifyListener(webSocket, new WebSocketEventListener.WebSocketEvent("", CONNECT, webSocket));
    } catch (AtmosphereMappingException ex) {
        cleanUpAfterDisconnect = true;
        throw ex;
    } catch (IOException ex) {
        cleanUpAfterDisconnect = true;
        throw ex;
    } catch (Exception ex) {
        logger.trace("onOpen exception", ex);
        cleanUpAfterDisconnect = true;
    } finally {
        if (cleanUpAfterDisconnect) {
            logger.warn("Problem opening websocket for {}", r.uuid());
            framework.atmosphereFactory().remove(r.uuid());
            AtmosphereResourceEventImpl.class.cast(r.getAtmosphereResourceEvent()).setCancelled(true);
            AsynchronousProcessor.class.cast(framework.getAsyncSupport()).completeLifecycle(r, true);
        }
        webSocket.shiftAttributes();
    }
}
Also used : Action(org.atmosphere.cpr.Action) AtmosphereResource(org.atmosphere.cpr.AtmosphereResource) AtomicReference(java.util.concurrent.atomic.AtomicReference) IOException(java.io.IOException) AtmosphereResourceEventImpl(org.atmosphere.cpr.AtmosphereResourceEventImpl) WebSocketEvent(org.atmosphere.websocket.WebSocketEventListener.WebSocketEvent) ServletException(jakarta.servlet.ServletException) AtmosphereMappingException(org.atmosphere.cpr.AtmosphereMappingException) IOException(java.io.IOException) AsynchronousProcessor(org.atmosphere.cpr.AsynchronousProcessor) AtmosphereMappingException(org.atmosphere.cpr.AtmosphereMappingException) Future(java.util.concurrent.Future) AtmosphereResourceImpl(org.atmosphere.cpr.AtmosphereResourceImpl)

Example 9 with AtmosphereResource

use of org.atmosphere.cpr.AtmosphereResource in project atmosphere by Atmosphere.

the class ProtocolUtil method constructRequest.

protected static AtmosphereRequestImpl.Builder constructRequest(WebSocket webSocket, String pathInfo, String requestURI, String methodType, String contentType, boolean destroyable) {
    AtmosphereResource resource = webSocket.resource();
    AtmosphereRequest request = AtmosphereResourceImpl.class.cast(resource).getRequest(false);
    Map<String, Object> m = attributes(webSocket, request);
    // We need to create a new AtmosphereRequest as WebSocket message may arrive concurrently on the same connection.
    AtmosphereRequestImpl.Builder b = (new AtmosphereRequestImpl.Builder().request(request).method(methodType).contentType(contentType == null ? request.getContentType() : contentType).attributes(m).pathInfo(pathInfo).contextPath(request.getContextPath()).servletPath(request.getServletPath()).requestURI(requestURI).requestURL(request.requestURL()).destroyable(destroyable).headers(request.headersMap()).session(resource.session()));
    return b;
}
Also used : AtmosphereRequestImpl(org.atmosphere.cpr.AtmosphereRequestImpl) AtmosphereRequest(org.atmosphere.cpr.AtmosphereRequest) AtmosphereResource(org.atmosphere.cpr.AtmosphereResource) AtmosphereResourceImpl(org.atmosphere.cpr.AtmosphereResourceImpl)

Example 10 with AtmosphereResource

use of org.atmosphere.cpr.AtmosphereResource in project atmosphere by Atmosphere.

the class ManagedAtmosphereHandlerTest method testHeartbeat.

@Test
public void testHeartbeat() throws IOException, ServletException {
    // Open connection
    AtmosphereRequest request = new AtmosphereRequestImpl.Builder().pathInfo("/heartbeat").method("GET").build();
    request.header(X_ATMOSPHERE_TRANSPORT, WEBSOCKET_TRANSPORT);
    framework.doCometSupport(request, AtmosphereResponseImpl.newInstance());
    // Check suspend
    final AtmosphereResource res = r.get();
    assertNotNull(res);
    // Send heartbeat
    request = new AtmosphereRequestImpl.Builder().pathInfo("/heartbeat").method("POST").body(Heartbeat.paddingData).build();
    request.header(X_ATMOSPHERE_TRANSPORT, WEBSOCKET_TRANSPORT);
    request.setAttribute(HeartbeatInterceptor.INTERCEPTOR_ADDED, "");
    res.initialize(res.getAtmosphereConfig(), res.getBroadcaster(), request, AtmosphereResponseImpl.newInstance(), framework.getAsyncSupport(), res.getAtmosphereHandler());
    request.setAttribute(FrameworkConfig.INJECTED_ATMOSPHERE_RESOURCE, res);
    framework.doCometSupport(request, AtmosphereResponseImpl.newInstance());
    assertNotNull(message.get());
    assertEquals(message.get(), Heartbeat.paddingData);
}
Also used : AtmosphereRequestImpl(org.atmosphere.cpr.AtmosphereRequestImpl) AtmosphereRequest(org.atmosphere.cpr.AtmosphereRequest) AtmosphereResource(org.atmosphere.cpr.AtmosphereResource) Test(org.testng.annotations.Test)

Aggregations

AtmosphereResource (org.atmosphere.cpr.AtmosphereResource)37 AtmosphereRequest (org.atmosphere.cpr.AtmosphereRequest)14 IOException (java.io.IOException)10 AtmosphereResourceImpl (org.atmosphere.cpr.AtmosphereResourceImpl)9 Broadcaster (org.atmosphere.cpr.Broadcaster)8 Test (org.junit.Test)7 UI (com.vaadin.flow.component.UI)5 SessionExpiredException (com.vaadin.flow.server.SessionExpiredException)4 VaadinServletRequest (com.vaadin.flow.server.VaadinServletRequest)4 VaadinSession (com.vaadin.flow.server.VaadinSession)4 InvalidUIDLSecurityKeyException (com.vaadin.flow.server.communication.ServerRpcHandler.InvalidUIDLSecurityKeyException)4 JsonException (elemental.json.JsonException)4 AsynchronousProcessor (org.atmosphere.cpr.AsynchronousProcessor)4 AtmosphereResourceEvent (org.atmosphere.cpr.AtmosphereResourceEvent)4 MockVaadinServletService (com.vaadin.flow.server.MockVaadinServletService)3 ServletException (jakarta.servlet.ServletException)3 HashSet (java.util.HashSet)3 Future (java.util.concurrent.Future)3 AtomicReference (java.util.concurrent.atomic.AtomicReference)3 AtmosphereResourceEventImpl (org.atmosphere.cpr.AtmosphereResourceEventImpl)3