diff --git a/bubble-server/src/main/java/bubble/service/device/FlexRouterService.java b/bubble-server/src/main/java/bubble/service/device/FlexRouterService.java index 00a93489..6643bf25 100644 --- a/bubble-server/src/main/java/bubble/service/device/FlexRouterService.java +++ b/bubble-server/src/main/java/bubble/service/device/FlexRouterService.java @@ -10,6 +10,7 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; +import org.cobbzilla.util.daemon.AwaitResult; import org.cobbzilla.util.daemon.SimpleDaemon; import org.cobbzilla.util.http.HttpRequestBean; import org.cobbzilla.util.http.HttpResponseBean; @@ -17,11 +18,16 @@ import org.cobbzilla.util.http.HttpUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import static bubble.model.device.FlexRouterPing.MAX_PING_AGE; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; +import static org.cobbzilla.util.daemon.Await.awaitAll; +import static org.cobbzilla.util.daemon.DaemonThreadFactory.fixedPool; import static org.cobbzilla.util.daemon.ZillaRuntime.shortError; import static org.cobbzilla.util.http.HttpMethods.POST; import static org.cobbzilla.util.json.JsonUtil.json; @@ -33,8 +39,8 @@ public class FlexRouterService extends SimpleDaemon { public static final int MAX_PING_TRIES = 5; private static final long PING_SLEEP_FACTOR = SECONDS.toMillis(2); - public static final int DEFAULT_PING_TIMEOUT = (int) SECONDS.toMillis(MAX_PING_AGE/2); - + // HttpClient timeouts are in seconds + public static final int DEFAULT_PING_TIMEOUT = (int) SECONDS.toSeconds(MAX_PING_AGE/2); public static final RequestConfig DEFAULT_PING_REQUEST_CONFIG = RequestConfig.custom() .setConnectTimeout(DEFAULT_PING_TIMEOUT) .setSocketTimeout(DEFAULT_PING_TIMEOUT) @@ -46,6 +52,8 @@ public class FlexRouterService extends SimpleDaemon { .build(); } + private static final long PING_ALL_TIMEOUT = MINUTES.toMillis(2); + @Getter private final long sleepTime = MINUTES.toMillis(2); @Autowired private FlexRouterDAO flexRouterDAO; @@ -54,12 +62,20 @@ public class FlexRouterService extends SimpleDaemon { try { @Cleanup final CloseableHttpClient httpClient = getHttpClient(); final List routers = flexRouterDAO.findEnabledAndRegistered(); + final List> futures = new ArrayList<>(); + @Cleanup("shutdownNow") final ExecutorService exec = fixedPool(5); for (FlexRouter router : routers) { - boolean active = pingFlexRouter(router, flexRouterDAO, httpClient); - if (active != router.active()) { - flexRouterDAO.update(router.setActive(active)); - } + futures.add(exec.submit(() -> { + boolean active = pingFlexRouter(router, flexRouterDAO, httpClient); + if (active != router.active()) { + flexRouterDAO.update(router.setActive(active)); + } + return active; + })); } + final AwaitResult awaitResult = awaitAll(futures, PING_ALL_TIMEOUT); + log.debug("process: awaitResult="+awaitResult); + } catch (Exception e) { log.error("process: "+shortError(e)); }