doc: 阅读TimeLimiter文档

This commit is contained in:
asahi
2025-09-03 15:51:32 +08:00
parent 4ddad7d316
commit 388e18af2a

View File

@@ -38,6 +38,10 @@
- [Decorate and execute a functional interface](#decorate-and-execute-a-functional-interface-3) - [Decorate and execute a functional interface](#decorate-and-execute-a-functional-interface-3)
- [consume emitted RegistryEvents](#consume-emitted-registryevents-3) - [consume emitted RegistryEvents](#consume-emitted-registryevents-3)
- [use custom IntervalFunction](#use-custom-intervalfunction) - [use custom IntervalFunction](#use-custom-intervalfunction)
- [TimeLimiter](#timelimiter)
- [Create a TimeLimiterRegistry](#create-a-timelimiterregistry)
- [Create and configure TimeLimiter](#create-and-configure-timelimiter)
- [decorate and execute a functional interface](#decorate-and-execute-a-functional-interface-4)
# CircuitBreaker # CircuitBreaker
@@ -861,4 +865,66 @@ RetryConfig retryConfig = RetryConfig.custom()
> >
> 如果指定了intervalFunction那么在通过builder创建RetryConfig时会自动通过intervalFunction给intervalBiFunction也赋值。 > 如果指定了intervalFunction那么在通过builder创建RetryConfig时会自动通过intervalFunction给intervalBiFunction也赋值。
> >
> 如果指定了intervalFunction或intervalBiFunction中任一则使用指定的函数来计算waitDuration当二者都没有指定时则waitDuration固定为waitDuration > 如果指定了intervalFunction或intervalBiFunction中任一则使用指定的函数来计算waitDuration当二者都没有指定时则waitDuration固定为waitDuration
## TimeLimiter
### Create a TimeLimiterRegistry
`CircuitBreaker` module类似TimeLimiter module支持提供in-memory TimeLimiterRegistry可用于管理TimeLimiter实例。
```java
TimeLimiterRegistry timeLimiterRegistry = TimeLimiterRegistry.ofDefaults();
```
### Create and configure TimeLimiter
可以提供一个全局的自定义TimeLimiterConfig支持通过builder创建。
TimeLimiterConfig支持配置如下两个参数
- the timeout duration
- whether cancel should be called on the running future
使用示例如下所示:
```java
TimeLimiterConfig config = TimeLimiterConfig.custom()
.cancelRunningFuture(true)
.timeoutDuration(Duration.ofMillis(500))
.build();
// Create a TimeLimiterRegistry with a custom global configuration
TimeLimiterRegistry timeLimiterRegistry = TimeLimiterRegistry.of(config);
// Get or create a TimeLimiter from the registry -
// TimeLimiter will be backed by the default config
TimeLimiter timeLimiterWithDefaultConfig = registry.timeLimiter("name1");
// Get or create a TimeLimiter from the registry,
// use a custom configuration when creating the TimeLimiter
TimeLimiterConfig config = TimeLimiterConfig.custom()
.cancelRunningFuture(false)
.timeoutDuration(Duration.ofMillis(1000))
.build();
TimeLimiter timeLimiterWithCustomConfig = registry.timeLimiter("name2", config);
```
### decorate and execute a functional interface
TimeLimiter可以对`CompletionStage``Future`进行decorate示例如下
```java
// Given I have a helloWorldService.sayHelloWorld() method which takes too long
HelloWorldService helloWorldService = mock(HelloWorldService.class);
// Create a TimeLimiter
TimeLimiter timeLimiter = TimeLimiter.of(Duration.ofSeconds(1));
// The Scheduler is needed to schedule a timeout on a non-blocking CompletableFuture
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
// The non-blocking variant with a CompletableFuture
CompletableFuture<String> result = timeLimiter.executeCompletionStage(
scheduler, () -> CompletableFuture.supplyAsync(helloWorldService::sayHelloWorld)).toCompletableFuture();
// The blocking variant which is basically future.get(timeoutDuration, MILLISECONDS)
String result = timeLimiter.executeFutureSupplier(
() -> CompletableFuture.supplyAsync(() -> helloWorldService::sayHelloWorld));
```
在TimeLimiter的实现中`timeoutDuration`设置了`等待future执行结束的最长等待时间`,如果该等待时间超时,将会抛出`TimeoutException`
当发生等待超时时,将会根据`shouldCancelRunningFuture`参数的配置来决定`是否针对尚未执行完成的future调用cancel`