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:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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!");
|
||||
|
||||
Reference in New Issue
Block a user