Skip to content

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

Open
@hulandianqing

Description

@hulandianqing

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的所有异常,问题解决

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions