Block while initializing RouteLocator the first time.

This allows the app to fail if there are failures loading routes on startup.

Fixes gh-1676
This commit is contained in:
spencergibb
2021-03-15 13:47:16 -04:00
parent 702c9aaeee
commit 78b20bd4cd
2 changed files with 13 additions and 3 deletions

View File

@@ -22,6 +22,7 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.logging.Log;
@@ -68,6 +69,8 @@ public class WeightCalculatorWebFilter implements WebFilter, Ordered, SmartAppli
private Map<String, GroupWeightConfig> groupWeights = new ConcurrentHashMap<>();
private final AtomicBoolean routeLocatorInitialized = new AtomicBoolean();
public WeightCalculatorWebFilter(ObjectProvider<RouteLocator> routeLocator,
ConfigurationService configurationService) {
this.routeLocator = routeLocator;
@@ -123,7 +126,16 @@ public class WeightCalculatorWebFilter implements WebFilter, Ordered, SmartAppli
}
else if (event instanceof RefreshRoutesEvent && routeLocator != null) {
// forces initialization
routeLocator.ifAvailable(locator -> locator.getRoutes().subscribe());
if (routeLocatorInitialized.compareAndSet(false, true)) {
// on first time, block so that app fails to start if there are errors in
// routes
// see gh-1574
routeLocator.ifAvailable(locator -> locator.getRoutes().blockLast());
}
else {
// this preserves previous behaviour on refresh, this could likely go away
routeLocator.ifAvailable(locator -> locator.getRoutes().subscribe());
}
}
}

View File

@@ -16,7 +16,6 @@
package org.springframework.cloud.gateway.test;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.boot.SpringBootConfiguration;
@@ -31,7 +30,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class RouteConstructionIntegrationTests {
@Test
@Ignore // FIXME: https://github.com/spring-cloud/spring-cloud-gateway/issues/1676
public void routesWithVerificationShouldFail() {
assertThatThrownBy(() -> new SpringApplicationBuilder(TestConfig.class).profiles("verification-route").run())
.hasMessageContaining("Stop right now!");