Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] webflux中SlotChainBuilder实例化异常后客户端被无限阻塞 #3488

Open
hulandianqing opened this issue Jan 17, 2025 · 0 comments

Comments

@hulandianqing
Copy link

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)

  1. 使用sentinel示例项目sentinel-webflux-example
  2. 配置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的所有异常,问题解决

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant