0

当我使用 spring-cloud-gateway 时,产生以下错误:

2019-01-21 00:35:22.906 [reactor-http-server-epoll-6] ERROR org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler - Failed to handle request [POST xxxxxxxxxxxxxxxx]java.lang.IndexOutOfBoundsException: Index: 1, Size: 5
        at java.util.ArrayList.rangeCheck(ArrayList.java:653)
        at java.util.ArrayList.get(ArrayList.java:429)
        at org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter.addWeightConfig(WeightCalculatorWebFilter.java:157)
        at org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter.handle(WeightCalculatorWebFilter.java:117)
        at org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter.onApplicationEvent(WeightCalculatorWebFilter.java:98)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:400)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:354)
        at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.lookup(RouteDefinitionRouteLocator.java:224)
        at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.combinePredicates(RouteDefinitionRouteLocator.java:200)
        at org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator.convertToRoute(RouteDefinitionRouteLocator.java:127)
        at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)
        at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:646)
        at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:523)
        at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:897)
        at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
        at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
        at reactor.core.publisher.Flux.subscribe(Flux.java:6873)
        at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:372)
        at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:232)
        at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:190)
        at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:332)
        at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
        at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
        at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97)
        at reactor.core.publisher.FluxMap.subscribe(FluxMap.java:62)
        at reactor.core.publisher.FluxMap.subscribe(FluxMap.java:62)
        at reactor.core.publisher.Flux.subscribe(Flux.java:6873)
        at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:372)
        at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:232)
        at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:190)
        at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:332)
        at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:128)
        at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:61)
        at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97)
        at reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)
        at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
        at reactor.core.publisher.MonoFlattenIterable.subscribe(MonoFlattenIterable.java:101)
        at reactor.core.publisher.FluxMaterialize.subscribe(FluxMaterialize.java:40)
        at reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)
        at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74)
        at reactor.core.publisher.MonoFlattenIterable.subscribe(MonoFlattenIterable.java:101)
        at reactor.core.publisher.FluxDematerialize.subscribe(FluxDematerialize.java:39)
        at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)
        at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121)
        at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40)

这是问题源代码:

config.ranges.clear();
config.ranges.add(0.0);

List<Double> values = new ArrayList<>(config.normalizedWeights.values());
        for (int i = 0; i < values.size(); i++) {
            Double currentWeight = values.get(i);
            Double previousRange = config.ranges.get(i);
            Double range = previousRange + currentWeight;
            config.ranges.add(range);
        }

我想这可能是由于并发性,但我不知道这是怎么发生的。我想知道这是怎么发生的,或者还有其他可能的原因导致这个问题发生。

4

1 回答 1

0

这可能是因为Double previousRange = config.ranges.get(i);当您第一次运行循环时该行i等于 0。

config.ranges当您要访问该列表的第一个元素时,请确保不为空。

在循环开始时,尝试记录或打印 的大小config.ranges并将其与i.

for (int i = 0; i < values.size(); i++) {
    System.out.println(String.format("Size of config.ranges - %d", format.ranges.size()));
    ...

如果 的大小config.ranges实际上是 0,那么您将需要更好的方法来实现您想要实现的任何内容。

于 2019-01-24T07:35:21.763 回答