Ich habe drei Fragen im Zusammenhang mit Project Reactor und ich werde sie unten fragen. Beginnen Sie mit dem Code, den ich habe (es wird vereinfacht, um das Problem leichter zu verstehen). Project Reactor Timeout-Behandlung
Mono<Integer> doWithSession(Function<String, Mono<Integer>> callback, long timeout) {
return Mono.just("hello")
.compose(monostr -> monostr
.doOnSuccess(str -> System.out.println("Suppose I want to release session here after all")) //(1)
.doOnCancel(() -> System.out.println("cancelled")) //(2)
.then(callback::apply)
.timeoutMillis(timeout, Mono.error(new TimeoutException("Timeout after " + timeout)))
);
}
Und Test:
@Test
public void testDoWithSession2() throws Exception {
Function<String, Mono<Integer>> fun1 = str -> Mono.fromCallable(() -> {
System.out.println("do some long timed work");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("work has completed");
return str.length();
});
StepVerifier.create(doWithSession(fun1,1000))
.verifyError(TimeoutException.class);
}
So und Fragen:
- wie Aufruf von
fun1
zu unterbrechen und sofort Fehler zurück? (Vielleicht mache ich etwas falsch, aber es sieht Fehler nicht nach Timeout zurück, aber nach allen Aufruf von Callback) - warum
doOnSuccess
unddoOnCancel
zur gleichen Zeit aufgerufen? (Ich erwartete, dass (1) oder (2) wird aufgerufen, aber die beide nicht) - Und wie mit folgendem Fall befassen:
- vorstellen, dass in Code
Mono.just("hello")
Verbindung erwirbt; - in
callback
Ich mache etwas mit Verbindung und bekomme ein Ergebnis (Mono<Integer>
in meinem Fall); - am Ende (bei Erfolg oder bei Ausfall) Ich möchte Sitzung (ich versuche, dies in (1) zu tun).
- vorstellen, dass in Code