sac/sf-vertx/src/test/java/com/sf/vertx/TestCircuitBreaker.java

61 lines
1.8 KiB
Java
Raw Normal View History

2024-04-29 16:15:45 +08:00
package com.sf.vertx;
import com.sf.vertx.api.pojo.VertxConfig;
import com.sf.vertx.handle.AppConfigHandle;
2024-04-29 16:15:45 +08:00
import io.vertx.circuitbreaker.CircuitBreaker;
import io.vertx.circuitbreaker.CircuitBreakerOptions;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpMethod;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TestCircuitBreaker {
private static int port;
public static void main(String[] args) {
VertxConfig vertxConfig = AppConfigHandle.getVertxConfig();
2024-04-29 16:15:45 +08:00
// TODO 编解码线程池,后面优化协程等方式
VertxOptions vertxOptions = new VertxOptions();
Vertx VERTX = Vertx.vertx(vertxOptions);
CircuitBreakerOptions options = new CircuitBreakerOptions().setMaxFailures(3).setTimeout(5000)
.setFallbackOnFailure(true);
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", VERTX, options).openHandler(v -> {
System.out.println("Circuit opened");
}).closeHandler(v -> {
System.out.println("Circuit closed");
});
for (int i = 0; i < 20; i++) {
port = 9199;
if(i % 2 == 0) {
port = 9198;
log.info("i:{},port:{}", i, port);
}
breaker.executeWithFallback(promise -> {
VERTX.createHttpClient().request(HttpMethod.POST, port, "localhost", "/vertx/body").compose(req -> {
return req.send("body").compose(resp -> {
if (resp.statusCode() != 200) {
return Future.failedFuture("HTTP error");
} else {
log.info("success req:{}", req.getPort());
return resp.body().map(Buffer::toString);
}
});
}).onComplete(promise);
}, v -> {
// Executed when the circuit is opened
return "Hello (fallback)";
}, ar -> {
// Do something with the result
System.out.println("Result: " + ar.result());
});
}
}
}