private DatabaseHandler(final RemoteEventBus eventBus) { this.eventBus = eventBus; delay = ServerStorage.getLocalStorageIfSupported() .getInt("APVS.database.updateDelay", DEFAULT_MAX_UPDATE_DELAY) * SECONDS; log.info("Using update delay: " + delay + " ms"); database = Database.getInstance(); RequestRemoteEvent.register( this, eventBus, new RequestRemoteEvent.Handler() { @Override public void onRequestEvent(RequestRemoteEvent event) { String type = event.getRequestedClassName(); if (type.equals(InterventionMapChangedRemoteEvent.class.getName())) { log.info("Request to DB " + event); InterventionMapChangedRemoteEvent.fire(this, eventBus, interventions); } else if (type.equals(ConnectionStatusChangedRemoteEvent.class.getName())) { ConnectionStatusChangedRemoteEvent.fire( eventBus, ConnectionType.databaseConnect, connected, connectedCause); ConnectionStatusChangedRemoteEvent.fire( eventBus, ConnectionType.databaseUpdate, updated, updatedCause); } } }); try { checkUpdateAndConnection(); readInterventions(); } catch (HibernateException e1) { log.warn("Problem", e1); } ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); executor.scheduleWithFixedDelay( new Runnable() { // ScheduledFuture<?> watchdog; @Override public void run() { try { if (!checkUpdateAndConnection()) { log.warn("DB " + updatedCause); } else if (!isConnected()) { log.warn("DB " + connectedCause); } } catch (HibernateException e) { log.warn("Could not update or reach DB: ", e); } } }, 0, 30, TimeUnit.SECONDS); }