增加web socket后异步执行获取不到request请求上下文

Blade 未结 2 23
lstar
lstar 剑者 2小时前

一、该问题的重现步骤是什么?

  1. 增加了maven里面的webscoket坐标

  2. <>
        <>org.springframework.boot</>
        <>spring-boot-starter-websocket</>
    </>
    <>
        <>org.apache.tomcat.embed</>
        <>tomcat-embed-websocket</>
    </>

2. 创建了一个线程池

{

    (name = )
    () {
       = ThreadPoolTaskExecutor();
       .setCorePoolSize();
       .setMaxPoolSize();
       .setQueueCapacity();
       .setThreadNamePrefix();
       .setRejectedExecutionHandler(.CallerRunsPolicy());
       .setWaitForTasksToCompleteOnShutdown();
       .setAwaitTerminationSeconds();

       .setTaskDecorator(BladeContextCopyingTaskDecorator());

       .initialize();
       ;
    }

    {
       () {
          = () .();
          = .();
          = .();

          () -> {
             {
                (!= ) {
                   .(, );
                }
                .();
                .run();
             } {
                .();
                .();
             }
          };
       }
    }

}

3.在使用线程池的时候报错

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

2025-11-10 09:53:27.297 ERROR 5663 --- [    ModelExec-2] c.z.a.m.s.impl.ModelAsyncTaskService     : 异步任务执行异常, taskId: 26c1a521-ccc8-4a37-9cc0-540d73a577bc


java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: 

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at com.zzy.analysis.model.service.impl.ModelAnalysisServiceImpl.execution(ModelAnalysisServiceImpl.java:179) ~[classes/:na]

at com.zzy.analysis.model.service.impl.ModelAsyncTaskService.lambda$executeTaskAsync$0(ModelAsyncTaskService.java:152) ~[classes/:na]

at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run$$$capture(CompletableFuture.java:1804) ~[na:na]

at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java) ~[na:na]

at com.zzy.analysis.model.config.ThreadPoolConfig$BladeContextCopyingTaskDecorator.lambda$decorate$0(ThreadPoolConfig.java:54) ~[classes/:na]

at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]

at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]

at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]

Caused by: org.mybatis.spring.MyBatisSystemException: 

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:99) ~[mybatis-spring-3.0.4.jar:3.0.4]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347) ~[mybatis-spring-3.0.4.jar:3.0.4]

at jdk.proxy2/jdk.proxy2.$Proxy178.selectOne(Unknown Source) ~[na:na]

at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) ~[mybatis-spring-3.0.4.jar:3.0.4]

at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:87) ~[mybatis-plus-core-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.8.jar:3.5.8]

at jdk.proxy2/jdk.proxy2.$Proxy271.selectById(Unknown Source) ~[na:na]

at com.baomidou.mybatisplus.extension.service.IService.getById(IService.java:290) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:174) ~[spring-context-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[spring-aop-6.1.15.jar:6.1.15]

at com.zzy.analysis.model.service.impl.ModelInfoServiceImpl$$SpringCGLIB$$0.getById(<generated>) ~[classes/:na]

at com.zzy.analysis.model.service.impl.ModelAnalysisServiceImpl.execution(ModelAnalysisServiceImpl.java:143) ~[classes/:na]

... 7 common frames omitted

Caused by: org.apache.ibatis.exceptions.PersistenceException: 

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) ~[mybatis-3.5.16.jar:3.5.16]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) ~[mybatis-spring-3.0.4.jar:3.0.4]

... 28 common frames omitted

Caused by: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at org.apache.catalina.connector.RequestFacade.checkFacade(RequestFacade.java:855) ~[tomcat-embed-core-10.1.33.jar:10.1.33]

at org.apache.catalina.connector.RequestFacade.getAttribute(RequestFacade.java:245) ~[tomcat-embed-core-10.1.33.jar:10.1.33]

at jakarta.servlet.ServletRequestWrapper.getAttribute(ServletRequestWrapper.java:84) ~[jakarta.servlet-api-6.0.0.jar:6.0.0]

at org.springblade.core.secure.utils.AuthUtil.getUser(AuthUtil.java:102) ~[blade-starter-auth-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.secure.utils.AuthUtil.getUserRole(AuthUtil.java:331) ~[blade-starter-auth-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.secure.utils.AuthUtil.isAdministrator(AuthUtil.java:178) ~[blade-starter-auth-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.tenant.BladeTenantInterceptor.doTenantFilters(BladeTenantInterceptor.java:132) ~[blade-starter-tenant-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.tenant.BladeTenantInterceptor.processPlainSelect(BladeTenantInterceptor.java:76) ~[blade-starter-tenant-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor.processSelectBody(BaseMultiTableInnerInterceptor.java:56) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.processSelect(TenantLineInnerInterceptor.java:87) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.processParser(JsqlParserSupport.java:90) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:49) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:67) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar:3.5.16]

at jdk.proxy2/jdk.proxy2.$Proxy218.query(Unknown Source) ~[na:na]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.16.jar:3.5.16]

... 36 common frames omitted


二、你期待的结果是什么?实际看到的又是什么?

想获取到用户上下文,不加webscoket是可以的,但是增加了webscoket就报错了


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

商业版 4.5.0

四、请提供详细的错误堆栈信息,这很重要。

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

2025-11-10 09:53:27.297 ERROR 5663 --- [    ModelExec-2] c.z.a.m.s.impl.ModelAsyncTaskService     : 异步任务执行异常, taskId: 26c1a521-ccc8-4a37-9cc0-540d73a577bc


java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: 

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at com.zzy.analysis.model.service.impl.ModelAnalysisServiceImpl.execution(ModelAnalysisServiceImpl.java:179) ~[classes/:na]

at com.zzy.analysis.model.service.impl.ModelAsyncTaskService.lambda$executeTaskAsync$0(ModelAsyncTaskService.java:152) ~[classes/:na]

at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run$$$capture(CompletableFuture.java:1804) ~[na:na]

at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java) ~[na:na]

at com.zzy.analysis.model.config.ThreadPoolConfig$BladeContextCopyingTaskDecorator.lambda$decorate$0(ThreadPoolConfig.java:54) ~[classes/:na]

at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]

at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]

at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]

Caused by: org.mybatis.spring.MyBatisSystemException: 

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:99) ~[mybatis-spring-3.0.4.jar:3.0.4]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347) ~[mybatis-spring-3.0.4.jar:3.0.4]

at jdk.proxy2/jdk.proxy2.$Proxy178.selectOne(Unknown Source) ~[na:na]

at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:154) ~[mybatis-spring-3.0.4.jar:3.0.4]

at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:87) ~[mybatis-plus-core-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.8.jar:3.5.8]

at jdk.proxy2/jdk.proxy2.$Proxy271.selectById(Unknown Source) ~[na:na]

at com.baomidou.mybatisplus.extension.service.IService.getById(IService.java:290) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:174) ~[spring-context-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.15.jar:6.1.15]

at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[spring-aop-6.1.15.jar:6.1.15]

at com.zzy.analysis.model.service.impl.ModelInfoServiceImpl$$SpringCGLIB$$0.getById(<generated>) ~[classes/:na]

at com.zzy.analysis.model.service.impl.ModelAnalysisServiceImpl.execution(ModelAnalysisServiceImpl.java:143) ~[classes/:na]

... 7 common frames omitted

Caused by: org.apache.ibatis.exceptions.PersistenceException: 

### Error querying database.  Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

### Cause: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.16.jar:3.5.16]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) ~[mybatis-3.5.16.jar:3.5.16]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333) ~[mybatis-spring-3.0.4.jar:3.0.4]

... 28 common frames omitted

Caused by: java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade

at org.apache.catalina.connector.RequestFacade.checkFacade(RequestFacade.java:855) ~[tomcat-embed-core-10.1.33.jar:10.1.33]

at org.apache.catalina.connector.RequestFacade.getAttribute(RequestFacade.java:245) ~[tomcat-embed-core-10.1.33.jar:10.1.33]

at jakarta.servlet.ServletRequestWrapper.getAttribute(ServletRequestWrapper.java:84) ~[jakarta.servlet-api-6.0.0.jar:6.0.0]

at org.springblade.core.secure.utils.AuthUtil.getUser(AuthUtil.java:102) ~[blade-starter-auth-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.secure.utils.AuthUtil.getUserRole(AuthUtil.java:331) ~[blade-starter-auth-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.secure.utils.AuthUtil.isAdministrator(AuthUtil.java:178) ~[blade-starter-auth-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.tenant.BladeTenantInterceptor.doTenantFilters(BladeTenantInterceptor.java:132) ~[blade-starter-tenant-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at org.springblade.core.tenant.BladeTenantInterceptor.processPlainSelect(BladeTenantInterceptor.java:76) ~[blade-starter-tenant-4.5.0.RELEASE.jar:4.5.0.RELEASE]

at com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor.processSelectBody(BaseMultiTableInnerInterceptor.java:56) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.processSelect(TenantLineInnerInterceptor.java:87) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.processParser(JsqlParserSupport.java:90) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.parser.JsqlParserSupport.parserSingle(JsqlParserSupport.java:49) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor.beforeQuery(TenantLineInnerInterceptor.java:67) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:78) ~[mybatis-plus-extension-3.5.8.jar:3.5.8]

at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.16.jar:3.5.16]

at jdk.proxy2/jdk.proxy2.$Proxy218.query(Unknown Source) ~[na:na]

at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.16.jar:3.5.16]

... 36 common frames omitted

五、若有更多详细信息,请在下面提供。

2条回答
  • 异步环境下request就是获取不到的,你可以提前获取request里的信息,然后通过本地线程来传递。


    0 讨论(1)
  • 2小时前

    可能通过本地线程传递,但是框架底层通过AuthUtil.getUser()方法获取的,这种代码还是会报错

    0 讨论(0)
提交回复