I have a server side application where clients can request to reload the configuration. If a client request to reload the configuration, this should not be done immediately, but with an delay of 1 minute. If another client also requests to reload the configuration in the same minute, this request should be ignored.
My idea is to schedule a task with a ScheduledExecutorService like:
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);
public class LoadConfigurationTask Runnable {
public void run() {
// LoadConfiguration
}
}
How can I check if a LoadConfigurationTask has been scheduled, but not executed yet, to be able to ignore further requests until the configuration is reloaded ?
You can simply get a reference to a ScheduledFuture like this:
ScheduledFuture<?> schedFuture = service.schedule(new LoadConfigurationTask(), 1, TimeUnit.MINUTES);
Now with the future, you can check if the task is done:
schedFuture.isDone();
Or even better, check how much time left before the execution will begin:
schedFuture.getDelay(TimeUnit.MINUTES);
There is no need for external variable to track the state.
The easiest way is just to set an AtomicBoolean
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html
Set it to true when you launch the task, set it to false when the task finishes, don't launch any more unless it is on false.
Make sure you do the setting to false in a finally block so you can't accidentally exit without un-setting it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With