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