[BUG] webflux中SlotChainBuilder实例化异常后客户端被无限阻塞
- Dominant language
- Java
- Stars
- 23.1k
- Forks
- 8.1k
- PR merge metrics
- No merged PRs in 30d
Description
## Issue Description
Type: *bug report*
### Describe what happened
在spring-webflux中使用sentinel
请求过程中实例化SlotChainBuilder报错后DefaultErrorWebExceptionHandler无法正常处理异常并且不会输出任何日志,客户端请求被无限阻塞.
原因是SentinelReactorSubscriber的entryWhenSubscribed()方法只处理了BlockException异常
```java
private void entryWhenSubscribed() {
ContextConfig sentinelContextConfig = this.entryConfig.getContextConfig();
if (sentinelContextConfig != null) {
ContextUtil.enter(sentinelContextConfig.getContextName(), sentinelContextConfig.getOrigin());
}
try {
AsyncEntry entry = SphU.asyncEntry(this.entryConfig.getResourceName(), this.entryConfig.getResourceType(), this.entryConfig.getEntryType(), this.entryConfig.getAcquireCount(), this.entryConfig.getArgs());
this.currentEntry = entry;
this.actual.onSubscribe(this);
} catch (BlockException ex) {
this.entryExited.set(true);
this.cancel();
this.actual.onSubscribe(this);
this.actual.onError(ex);
} finally {
if (sentinelContextConfig != null) {
ContextUtil.exit();
}
}
}
```
### Describe what you expected to happen
### How to reproduce it (as minimally and precisely as possible)
1. 使用sentinel示例项目sentinel-webflux-example
2. 配置com.alibaba.csp.sentinel.slotchain.SlotChainBuilder的自定义实现
```jajva
public class TestBuilder extends DefaultSlotChainBuilder {
@Override
public ProcessorSlotChain build() {
ProcessorSlotChain chain = super.build();
if(1==1){
// 强制抛出异常
throw new RuntimeException();
}
return chain;
}
}
```
### Tell us your environment
jdk21、spring-webflux:3.2.9
### Anything else we need to know?
entryWhenSubscribed()方法中处理包括BlockException的所有异常,问题解决
Contributor guide
Research direction
Start with SentinelReactorSubscriber.entryWhenSubscribed() and reproduce the failure in the sentinel-webflux-example using the custom SlotChainBuilder shown in the issue. Check how the RuntimeException moves through Spring WebFlux and DefaultErrorWebExceptionHandler. Done means the client request terminates with the exception handled rather than remaining blocked, with the failure observable through logging or error propagation.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100