【问题标题】:Is thread safe to inject an aop:scoped-proxy with scope="request" bean in a singleton bean like a Servlet or a Filter?在像 Servlet 或过滤器这样的单例 bean 中注入带有 scope="request" bean 的 aop:scoped-proxy 是否线程安全?
【发布时间】:2021-01-22 17:55:56
【问题描述】:

我有一个 javax.servlet.Filter(因此站点的所有用户共享一个单例),其中注入了一个带有 scope="request" 的 aop:scoped-proxy。

这里是过滤代码:

public class RequestLoggerFilter extends GenericFilterBean {

@Inject
private RequestMonitoringDetail monitoringDetail;    

这是代理的 bean 配置:

<bean id="requestMonitoringDetail" class="com.logging.data.RequestMonitoringDetail" scope="request">
  <aop:scoped-proxy />
</bean>

RequestMonitoringDetail bean 的范围是请求,因此将为每个请求创建一个新实例,并由注入过滤器的代理使用。 我认为它是线程安全的。

问题是在代理上调用方法时不时出现 NullPointerException:

java.lang.NullPointerException
    at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1555)
    at org.apache.catalina.connector.Request.setAttribute(Request.java:1541)
    at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:540)
    at org.springframework.web.context.request.ServletRequestAttributes.setAttribute(ServletRequestAttributes.java:124)
    at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:44)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:327)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:34)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.getTarget(CglibAopProxy.java:665)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:616)
    at com.logging.data.RequestMonitoringDetail$$EnhancerBySpringCGLIB$$6c595aed.getShortLogDetailSuffixesForMonitoring(<generated>)
    at ...

怎么会这样?

【问题讨论】:

  • 您没有在请求中使用调度程序或新线程。请求范围 bean 显然是安全的,但是当您使用新线程或调度程序作业时,它会得到 Nullpointer
  • 据我所知,没有新的线程/作业调度程序(很长的遗留代码..)

标签: java spring multithreading dependency-injection httprequest


【解决方案1】:

终于找到原因了:tomcat关机了。 就在报错之前,有一个关机信号:

12-Jan-2021 18:18:11.550 INFOS [RMI TCP Connection(181)-10.109.0.23] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio2-0.0.0.0-8009"]

还不知道是从哪里来的,但似乎是之后出现错误的原因。

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2020-05-21
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多