diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java index 1b7b17b9..9353c446 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/WeightCalculatorWebFilter.java @@ -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 groupWeights = new ConcurrentHashMap<>(); + private final AtomicBoolean routeLocatorInitialized = new AtomicBoolean(); + public WeightCalculatorWebFilter(ObjectProvider 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()); + } } } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java index f5669522..ceefb7a5 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/test/RouteConstructionIntegrationTests.java @@ -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!");