/** * */ package org.devgateway.toolkit.web.spring; import java.util.concurrent.Future; import org.devgateway.toolkit.web.spring.util.AsyncBeanParamControllerMethodCallable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service; /** * @author mihai Service designed to run a * {@link AsyncBeanParamControllerMethodCallable} using a {@link Object} * as its parameter. and return the results in an {@link Async} way. */ @Service public class AsyncControllerLookupService { private static final int PAUSE_BW_CHECKS_MILLIS = 10; private static final Logger logger = LoggerFactory.getLogger(AsyncControllerLookupService.class); @Async public <RET, FILT> Future<RET> asyncInvoke(final AsyncBeanParamControllerMethodCallable<RET, FILT> callable, final FILT filter) { logger.debug("Invoking " + callable); return new AsyncResult<>(callable.invokeControllerMethod(filter)); } /** * Convenience method that waits until the entire list of {@link Future} * tasks is done executing. that means {@link Future#isDone()} is true for * all. Invoking this method will block current thread until all tasks are * done. * * @param future * the list of {@link Future} tasks to wait execution */ public void waitTillDone(final Future<?>... future) { boolean done = false; while (!done) { done = true; for (int i = 0; i < future.length; i++) { if (!future[i].isDone()) { done = false; logger.debug("Still waiting for at least one task to finalize!"); break; } } try { Thread.sleep(PAUSE_BW_CHECKS_MILLIS); } catch (InterruptedException e) { throw new RuntimeException(e); } } logger.debug("All tasks done!"); } }