package pl.llp.aircasting.sensor; import pl.llp.aircasting.util.Constants; import com.google.common.eventbus.EventBus; public abstract class Worker { private static final long MAX_CONNECTION_FAILURE_TIME = Constants.ONE_MINUTE; protected final EventBus eventBus; private volatile long connectionFailingSince = -1; Status status = Status.NOT_YET_STARTED; Worker(EventBus eventBus) { this.eventBus = eventBus; } protected void considerStoppingOnFailure() { long currentTime = System.currentTimeMillis(); if(connectionFailingSince < 0) { connectionFailingSince = currentTime; } else { long difference = currentTime - connectionFailingSince; if(difference > MAX_CONNECTION_FAILURE_TIME) { handlePersistentFailure(); stop(); } } } public void start() { status = Status.STARTED; customStart(); } public void stop() { status = Status.STOPPED; customStop(); } public abstract void customStart(); public abstract void customStop(); public abstract void handlePersistentFailure(); }