Search in sources :

Example 1 with BroadcasterConfig

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;
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) BroadcasterLifeCyclePolicy(org.atmosphere.runtime.BroadcasterLifeCyclePolicy) AtmosphereResource(org.atmosphere.runtime.AtmosphereResource) BroadcasterConfig(org.atmosphere.runtime.BroadcasterConfig)

Example 2 with BroadcasterConfig

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;
}
Also used : BroadcasterLifeCyclePolicy(org.atmosphere.runtime.BroadcasterLifeCyclePolicy) AtmosphereResource(org.atmosphere.runtime.AtmosphereResource) BroadcasterConfig(org.atmosphere.runtime.BroadcasterConfig)

Aggregations

AtmosphereResource (org.atmosphere.runtime.AtmosphereResource)2 BroadcasterConfig (org.atmosphere.runtime.BroadcasterConfig)2 BroadcasterLifeCyclePolicy (org.atmosphere.runtime.BroadcasterLifeCyclePolicy)2 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1