package com.yoghurt.crypto.transactions.server.servlets.providers; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import com.yoghurt.crypto.transactions.shared.domain.exception.ApplicationException; import com.yoghurt.crypto.transactions.shared.service.BlockchainRetrievalService; public class LatestBlockRetriever { private static final long INITIAL_DELAY = 1; private static final long BLOCK_RETRIEVE_DELAY = 30; private final AtomicReference<String> atomicLastBlockHash = new AtomicReference<>(); private final ScheduledExecutorService executor; private final Runnable command = new Runnable() { @Override public void run() { try { atomicLastBlockHash.set(hook.getLatestBlockHash()); } catch (final ApplicationException e) { // Ignore } } }; private final BlockchainRetrievalService hook; public LatestBlockRetriever(final BlockchainRetrievalService hook) { this.hook = hook; executor = Executors.newSingleThreadScheduledExecutor(); } public void start() { executor.scheduleWithFixedDelay(command, INITIAL_DELAY, BLOCK_RETRIEVE_DELAY, TimeUnit.SECONDS); } public String getLatestHash() { return atomicLastBlockHash.get(); } public void stop() { executor.shutdownNow(); } }