Search code examples
javamultithreadingtimerpollingcountdownlatch

Java Using CountDownLatch to poll a method until a success response


I am trying to call a method multiple times every 60 seconds until a success response from the method which actually calls a rest end point on a different service. As of now I am using do while loop and using

Thread.sleep(60000);

to make the main thread wait 60 seconds which I feel is not the ideal way due to concurrency issues.

I came across the CountDownLatch method using

CountDownLatch latch = new CountDownLatch(1);
boolean processingCompleteWithin60Second = latch.await(60, TimeUnit.SECONDS);

@Override
public void run(){

    String processStat = null;
    try {
        status = getStat(processStatId);
        if("SUCCEEDED".equals(processStat))
        {
            latch.countDown();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }   
}

I have the run method in a different class which implements runnable. Not able to get this working. Any idea what is wrong?


Solution

  • Finally got it to work using Executor Framework.

                final int[] value = new int[1];
                pollExecutor.scheduleWithFixedDelay(new Runnable() {
    
                    Map<String, String> statMap = null;
    
                    @Override
                    public void run() {
    
                        try {
                            statMap = coldService.doPoll(id);
                        } catch (Exception e) {
    
                        }
                        if (statMap != null) {
                            for (Map.Entry<String, String> entry : statMap
                                    .entrySet()) {
                                if ("failed".equals(entry.getValue())) {
                                    value[0] = 2;
    
                                    pollExecutor.shutdown();
                                }
                            }
                        }
                    }
    
                }, 0, 5, TimeUnit.MINUTES);
                try {
                    pollExecutor.awaitTermination(40, TimeUnit.MINUTES);
                } catch (InterruptedException e) {
    
                }