Open
Description
Issue Description
Type: bug report
Describe what happened
在spring-webflux中使用sentinel
请求过程中实例化SlotChainBuilder报错后DefaultErrorWebExceptionHandler无法正常处理异常并且不会输出任何日志,客户端请求被无限阻塞.
原因是SentinelReactorSubscriber的entryWhenSubscribed()方法只处理了BlockException异常
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)
- 使用sentinel示例项目sentinel-webflux-example
- 配置com.alibaba.csp.sentinel.slotchain.SlotChainBuilder的自定义实现
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的所有异常,问题解决
Metadata
Metadata
Assignees
Labels
No labels
Activity