Makes CachingRouteLocator earlier for event listeners.

fixes gh-1377
This commit is contained in:
Spencer Gibb
2019-12-17 20:58:38 -05:00
parent 259d4bd8ad
commit 81ff34f858
2 changed files with 33 additions and 1 deletions

View File

@@ -26,13 +26,14 @@ import reactor.core.publisher.Flux;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
/**
* @author Spencer Gibb
*/
public class CachingRouteLocator
implements RouteLocator, ApplicationListener<RefreshRoutesEvent> {
implements Ordered, RouteLocator, ApplicationListener<RefreshRoutesEvent> {
private static final String CACHE_KEY = "routes";
@@ -77,4 +78,9 @@ public class CachingRouteLocator
refresh();
}
@Override
public int getOrder() {
return 0;
}
}

View File

@@ -16,6 +16,8 @@
package org.springframework.cloud.gateway.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
@@ -32,11 +34,17 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter;
import org.springframework.cloud.gateway.filter.headers.ForwardedHeadersFilter;
import org.springframework.cloud.gateway.filter.headers.XForwardedHeadersFilter;
import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping;
import org.springframework.cloud.gateway.route.CachingRouteLocator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
@@ -60,6 +68,24 @@ public class GatewayIntegrationTests extends BaseWebClientTests {
@Autowired
private GatewayProperties properties;
@Autowired
private ApplicationContext context;
@Test
public void listenersInOrder() {
assertThat(context).isInstanceOf(AbstractApplicationContext.class);
AbstractApplicationContext ctxt = (AbstractApplicationContext) context;
List<ApplicationListener<?>> applicationListeners = new ArrayList<>(
ctxt.getApplicationListeners());
AnnotationAwareOrderComparator.sort(applicationListeners);
int weightFilterIndex = applicationListeners
.indexOf(context.getBean(WeightCalculatorWebFilter.class));
int routeLocatorIndex = applicationListeners
.indexOf(context.getBean(CachingRouteLocator.class));
assertThat(weightFilterIndex > routeLocatorIndex)
.as("CachingRouteLocator is after WeightCalculatorWebFilter").isTrue();
}
@Test
public void complexContentTypeWorks() {
testClient.post().uri("/headers").contentType(MediaType.APPLICATION_JSON_UTF8)