All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nohope.app.AsyncApp Maven / Gradle / Ivy

The newest version!
package org.nohope.app;

import org.nohope.logging.Logger;
import org.nohope.logging.LoggerFactory;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @author ketoth xupack
 * @since 7/15/12 3:23 PM
 */
public abstract class AsyncApp extends App {
    private final AtomicReference state = new AtomicReference<>(AppState.INITIALIZING);
    private static final Logger LOG = LoggerFactory.getLogger(AsyncApp.class);

    private final CountDownLatch latch;

    protected void onPlannedStop() {
    }

    protected void onForcedShutdown() {
    }

    void onPlannedShutdown() {
    }

    protected AsyncApp() {
        this(1);
    }

    private AsyncApp(final int count) {
        latch = new CountDownLatch(count);
    }

    public final void stop() {
        setState(AppState.TERMINATING);
        onPlannedStop();
        setState(AppState.TERMINATED);
        latch.countDown();
    }

    @Override
    public final void start() throws Exception {
        LOG.debug("Performing application startup");
        super.start();
        LOG.debug("Startup routine completed");

        if (!(getState() == AppState.TERMINATED || getState() == AppState.TERMINATING)) {
            setState(AppState.RUNNING);
            latch.await();
        } else {
            LOG.warn("Application was terminated due start() routine. Is it really async?");
        }
    }

    @Override
    protected final void onVMShutdownWrapper() {
        LOG.debug("Executing base VM shutdown handler");
        super.onVMShutdownWrapper();
        LOG.debug("VM shutdown handled");

        if (getState() == AppState.RUNNING || getState() == AppState.INITIALIZING) {
            LOG.debug("Termination was forced");
            onForcedShutdown();
        } else {
            LOG.debug("Termination was planned");
            onPlannedShutdown();
        }

        setState(AppState.TERMINATED);
        latch.countDown();
    }

    public final boolean isStarted() {
        return state.get() == AppState.RUNNING;
    }

    private AppState getState() {
        return state.get();
    }

    private void setState(final AppState stateValue) {
        LOG.debug("Setting application state to {}", stateValue);
        state.set(stateValue);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy