use of org.atmosphere.runtime.BroadcasterConfig in project atmosphere by Atmosphere.
the class LifecycleHandler method on.
public LifecycleHandler on(final DefaultBroadcaster broadcaster) {
final BroadcasterLifeCyclePolicy lifeCyclePolicy = broadcaster.getBroadcasterLifeCyclePolicy();
final BroadcasterConfig bc = broadcaster.getBroadcasterConfig();
final Collection<AtmosphereResource> resources = broadcaster.getAtmosphereResources();
final AtomicBoolean recentActivity = broadcaster.recentActivity();
if (logger.isTraceEnabled()) {
logger.trace("{} new lifecycle policy: {}", broadcaster.getID(), lifeCyclePolicy.getLifeCyclePolicy().name());
}
if (broadcaster.currentLifecycleTask() != null) {
broadcaster.currentLifecycleTask().cancel(false);
}
if (bc != null && bc.getScheduledExecutorService() == null) {
logger.error("No Broadcaster's SchedulerExecutorService has been configured on {}. BroadcasterLifeCyclePolicy won't work.", broadcaster.getID());
return this;
}
if (lifeCyclePolicy.getLifeCyclePolicy() == IDLE || lifeCyclePolicy.getLifeCyclePolicy() == IDLE_RESUME || lifeCyclePolicy.getLifeCyclePolicy() == IDLE_DESTROY) {
recentActivity.set(false);
int time = lifeCyclePolicy.getTimeout();
if (time == -1) {
throw new IllegalStateException("BroadcasterLifeCyclePolicy time is not set");
}
Future<?> currentLifecycleTask = bc.getScheduledExecutorService().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
// Check for activity since the last execution.
if (recentActivity.getAndSet(false)) {
return;
} else if (resources.isEmpty()) {
if (lifeCyclePolicy.getLifeCyclePolicy() == IDLE) {
notifyEmptyListener(broadcaster);
notifyIdleListener(broadcaster);
broadcaster.releaseExternalResources();
logger.debug("Applying BroadcasterLifeCyclePolicy IDLE policy to Broadcaster {}", broadcaster.getID());
if (broadcaster.currentLifecycleTask() != null) {
broadcaster.currentLifecycleTask().cancel(true);
}
} else if (lifeCyclePolicy.getLifeCyclePolicy() == IDLE_DESTROY) {
notifyEmptyListener(broadcaster);
notifyIdleListener(broadcaster);
destroy(false);
logger.debug("Applying BroadcasterLifeCyclePolicy IDLE_DESTROY policy to Broadcaster {}", broadcaster.getID());
}
} else if (lifeCyclePolicy.getLifeCyclePolicy() == IDLE_RESUME) {
notifyIdleListener(broadcaster);
destroy(true);
logger.debug("Applying BroadcasterLifeCyclePolicy IDLE_RESUME policy to Broadcaster {}", broadcaster.getID());
}
} catch (Throwable t) {
if (broadcaster.isDestroyed()) {
logger.trace("Scheduled BroadcasterLifeCyclePolicy exception", t);
} else {
logger.warn("Scheduled BroadcasterLifeCyclePolicy exception", t);
}
}
}
void destroy(boolean resume) {
if (resume) {
logger.info("All AtmosphereResource will now be resumed from Broadcaster {}", broadcaster.getID());
broadcaster.resumeAll();
}
broadcaster.destroy();
/**
* The value may be null if the timeout is too low. Hopefully next execution will
* cancel the task properly.
*/
if (broadcaster.currentLifecycleTask() != null) {
broadcaster.currentLifecycleTask().cancel(true);
}
}
}, time, time, lifeCyclePolicy.getTimeUnit());
broadcaster.currentLifecycleTask(currentLifecycleTask);
}
return this;
}
use of org.atmosphere.runtime.BroadcasterConfig in project atmosphere by Atmosphere.
the class LifecycleHandler method offIfEmpty.
public LifecycleHandler offIfEmpty(DefaultBroadcaster broadcaster) {
BroadcasterConfig bc = broadcaster.getBroadcasterConfig();
Collection<AtmosphereResource> resources = broadcaster.getAtmosphereResources();
final BroadcasterLifeCyclePolicy lifeCyclePolicy = broadcaster.getBroadcasterLifeCyclePolicy();
if (resources.isEmpty()) {
notifyEmptyListener(broadcaster);
if (broadcaster.getScope() != Broadcaster.SCOPE.REQUEST && lifeCyclePolicy.getLifeCyclePolicy() == EMPTY) {
broadcaster.releaseExternalResources();
} else if (broadcaster.getScope() == Broadcaster.SCOPE.REQUEST || lifeCyclePolicy.getLifeCyclePolicy() == EMPTY_DESTROY) {
bc.getAtmosphereConfig().getBroadcasterFactory().remove(broadcaster, broadcaster.getID());
broadcaster.destroy();
}
}
return this;
}
Aggregations