Java 使用@Async:NullPointerException的Weblogic部署中的Spring自动连线和bean范围
考虑采用以下(简化)架构的Spring webapp:Java 使用@Async:NullPointerException的Weblogic部署中的Spring自动连线和bean范围,java,spring,weblogic,Java,Spring,Weblogic,考虑采用以下(简化)架构的Spring webapp: 具有注释为@Async的方法的服务: @服务 公共类MatriceAsyncFacade实现了IMatriceAsyncFacade{ @资源 私有矩阵服务myService; @凌驾 @异步(MatriceFacadeAsyncConfig.MATRICE\u执行者\u名称) 公共未来getMatriceFuture(Matrice Matrice)抛出TaskRejectedException{ 返回新的AsyncResult(this
@服务
公共类MatriceAsyncFacade实现了IMatriceAsyncFacade{
@资源
私有矩阵服务myService;
@凌驾
@异步(MatriceFacadeAsyncConfig.MATRICE\u执行者\u名称)
公共未来getMatriceFuture(Matrice Matrice)抛出TaskRejectedException{
返回新的AsyncResult(this.myService.build(matrice));
}
}
@配置
@使能同步
公共类MatriceFacadeAsyncConfig{
公共静态最终字符串矩阵\u执行器\u NAME=“builderMatriceExecutor”;
@资源
private InitialisationDto InitialisationDto;
@Bean(名称=矩阵执行器名称)
//@Scope(WebApplicationContext.Scope\u APPLICATION)//重要\u行\u 1
公共执行器线程池任务执行器(){
final ThreadPoolTaskExecutor tpte=新的ThreadPoolTaskExecutor();
info(“threadPoolTaskExecutor()corePoolSize={}”,
this.initialisationDto.getMatriceCExecutorCorePoolSize());
setCorePoolSize(this.initialisationDto.getMatriceCExecutorCorepoolSize());
返回tpte;
}
}
问题是:
- 在(本地)Tomcat中部署webapp,效果很好(注意注释的@Scope()
- 在我们的集成Weblogic服务器中部署webapp时,我必须添加@Scope行,否则部署时会出现NullPointerException:
原因:java.lang.NullPointerException
在com.my.pacakge.config.matricefacadesyncconfig.threadPoolTaskExecutor上(matricefacadesyncconfig.java:48)
在com.my.pacakge.config.matricefacadesyncconfig$$EnhancerBySpringCGLIB$$615d2556.CGLIB$threadPoolTaskExecutor$0()上
NPE从该行提升:
tpte.setCorePoolSize(this.initialisationDto.getMatriceCExecutorCorepoolSize());
在日志中,我首先可以看到webapp正在初始化,InitialisationDto正在实例化和填充。紧接着,ConfigurationClass中的bean被创建并显示日志“corePoolSize=…”在那之后,我有了NPE,就好像Weblogic试图再次实例化这个bean,但是没有初始化数据可用一样
默认情况下,bean是单例的,那么为什么在executorbean上添加@Scope(WebApplicationContext.Scope\u APPLICATION)似乎可以解决这个问题呢
注意:在添加范围注释时,Executor似乎是延迟实例化的,而不是在应用程序部署时
版本:
- 爪哇8
- 弹簧4.3.9.1释放
- Weblogic 12.2
- 雄猫9
TLDR:在Weblogic部署中,@Async[singleton vs APPLICATION\u SCOPE]bean之间的实际差异?确保在Weblogic上您不会意外地将附带的Spring与Weblogic一起使用(是的,Weblogic附带了它自己的(旧)版本的Spring!)。这会导致行为上的差异。此外,问题更多的是单例配置bean与应用程序范围的配置bean(因为错误发生在配置上,而不是异步调用的方法)。在单例和应用程序范围上有一点不同。单例是每个应用程序上下文的(因此,如果您有一个servlet和侦听器,那么您就有两个上下文!)。