Spring4 / Java 8 / Weblogic 12 - WorkManagerTaskExecutor.schedule导致StackOverFlowError的递归调用

时间:2017-01-06 12:36:58

标签: java spring weblogic workmanagertaskexecutor

我们已将企业软件从Java 7迁移到Java 8,并随之将Spring更新到4.3.4版。从那时起部署失败,因为StackOverflowError导致无法初始化其中一个bean:

Caused By: java.lang.StackOverflowError
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:204)

如您所见,方法schedule()被递归调用,导致堆栈溢出。 该应用程序部署在Weblogic版本12.1.3上;这是WorkManagerTaskExecutor.schedule()的代码片段:

return this.workManager.schedule(work);

因此,这应该将调度调用委托给目标WorkManager对象。但是,根据我们的调试分析, WorkManagerTaskExecutor 中的私有成员 workManager 已使用 WorkManagerTaskExecutor 类型的实例进行初始化,即 this时.workManager.schedule(work); 被执行,它正在调用 WorkManagerTaskExecutor.schedule(),从而导致递归调用。

目标WorkManager for Weblogic在部署描述符中设置如下: ...

<resource-ref>
            <res-ref-name>wm/MyWorkManager</res-ref-name>
            <res-type>commonj.work.WorkManager</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
        </resource-ref>

...

<work-manager>
    <name>wm/ODSCacheWorkManager</name>
    <max-threads-constraint>
        <name>MaxThreads</name>
        <count>1</count>
    </max-threads-constraint>
    <ignore-stuck-threads>true</ignore-stuck-threads>
</work-manager>

...

在Spring应用程序上下文中:

<bean autowire="byType" id="taskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
            <property name="workManagerName" value="java:comp/env/wm/MyWorkManager"/>
            <property name="resourceRef" value="true"/>
        </bean> 

为什么 WorkManagerTaskExecutor 中的 workManager 再次初始化为 WorkManagerTaskExecutor 的实例,导致递归,我们正在认真思考。社区可以提供帮助吗?

0 个答案:

没有答案