瀏覽代碼

fix http timeouts, use thread pool for concurrent pings

pull/51/head
Jonathan Cobb 4 年之前
父節點
當前提交
8fa2d0e158
共有 1 個檔案被更改,包括 22 行新增6 行删除
  1. +22
    -6
      bubble-server/src/main/java/bubble/service/device/FlexRouterService.java

+ 22
- 6
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<FlexRouter> routers = flexRouterDAO.findEnabledAndRegistered();
final List<Future<?>> 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<Boolean> awaitResult = awaitAll(futures, PING_ALL_TIMEOUT);
log.debug("process: awaitResult="+awaitResult);

} catch (Exception e) {
log.error("process: "+shortError(e));
}


Loading…
取消
儲存