Resilience4j Schutzschalter mit reaktiven Flux verwendet ändert sich nie auf Fehler auf OPEN

stimmen
0

Ich Auswertung resilience4j es in unseren reaktiven APIs enthält, so weit ich Mock Flußmittel verwenden.

Der Service unter nicht immer, wie ich, wenn die Schaltung auf mehrere Fehler öffnet testen möchten:

@Service
class GamesRepositoryImpl : GamesRepository {

    override fun findAll(): Flux<Game> {
        return if (Math.random() <= 1.0) {
            Flux.error(RuntimeException(fail))
        } else {
            Flux.just(
                    Game(The Secret of Monkey Island),
                    Game(Loom),
                    Game(Maniac Mansion),
                    Game(Day of the Tentacle)).log()
        }
    }
}

Dies ist die Prozedur, die das Repository verwendet, den Druck, den Zustand der Schaltung:

@Component
class ApiHandlers(private val gamesRepository: GamesRepository) {

    var circuitBreaker : CircuitBreaker = CircuitBreaker.ofDefaults(gamesCircuitBreaker)

    fun getGames(serverRequest: ServerRequest) : Mono<ServerResponse> {
        println(*********${circuitBreaker.state})
        return ok().body(gamesRepository.findAll().transform(CircuitBreakerOperator.of(circuitBreaker)), Game::class.java)
    }
}

Ich rufe die API-Endpunkt viele Male, immer diese stacktrace erhalten:

*********CLOSED
2018-03-14 12:02:28.153 ERROR 1658 --- [ctor-http-nio-3] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [GET http://localhost:8081/api/v1/games]

java.lang.RuntimeException: FAIL
    at com.codependent.reactivegames.repository.GamesRepositoryImpl.findAll(GamesRepositoryImpl.kt:12) ~[classes/:na]
    at com.codependent.reactivegames.web.handler.ApiHandlers.getGames(ApiHandlers.kt:20) ~[classes/:na]
    ...

2018-03-14 12:05:48.973 DEBUG 1671 --- [ctor-http-nio-2] i.g.r.c.i.CircuitBreakerStateMachine     : No Consumers: Event ERROR not published
2018-03-14 12:05:48.975 ERROR 1671 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [GET http://localhost:8081/api/v1/games]

java.lang.RuntimeException: fail
    at com.codependent.reactivegames.repository.GamesRepositoryImpl.findAll(GamesRepositoryImpl.kt:12) ~[classes/:na]
    at com.codependent.reactivegames.web.handler.ApiHandlers.getGames(ApiHandlers.kt:20) ~[classes/:na]
    at com.codependent.reactivegames.web.route.ApiRoutes$apiRouter$1$1$1.invoke(ApiRoutes.kt:14) ~[classes/:na]

Wie Sie die Schaltung zu sehen ist immer geschlossen. Ich weiß nicht , ob es irgendetwas diese Meldung zu tun hat , aber zu bemerken No Consumers: Event ERROR not published.

Warum funktioniert das nicht?


Veröffentlicht am 14/03/2018 um 09:08
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Das Problem war der Standard ringBufferSizeInClosedStateder 100 Anfragen und ich habe noch nie so viele manuellen Anfragen.

Ich Setup meine eigene CircuitBreakerConfigfür meine Tests und jetzt die Schaltung öffnet sofort:

val circuitBreakerConfig : CircuitBreakerConfig = CircuitBreakerConfig.custom()
        .failureRateThreshold(50f)
        .waitDurationInOpenState(Duration.ofMillis(10000))
        .ringBufferSizeInHalfOpenState(5)
        .ringBufferSizeInClosedState(5)
        .build()
var circuitBreaker: CircuitBreaker = CircuitBreaker.of("gamesCircuitBreaker", circuitBreakerConfig)
Beantwortet am 14/03/2018 um 09:39
quelle vom benutzer

stimmen
-1

Standard ringBufferSizeInClosedState 100 und failureRateThreshold ist 50.0F, ändern Zahlen zu senken Kreis offen zu testen.

CircuitBreakerConfig.custom().failureRateThreshold(1.0F)
                .waitDurationInOpenState(Duration.ofMinutes(2))
                .ringBufferSizeInHalfOpenState(10)
                .ringBufferSizeInClosedState(2)
                .build();
Beantwortet am 06/09/2019 um 02:04
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more