Spring4 / Java 8 / Weblogic 12 - WorkManagerTaskExecutor.schedule рекурсивные вызовы, вызывающие StackOverFlowError

Мы перенесли наше корпоративное программное обеспечение с Java 7 на Java 8 и вместе с ним обновили Spring до версии 4.3.4. С тех пор развертывание не выполняется, так как один из компонентов не может быть инициализирован из-за ошибки StackruError:

Caused By: java.lang.StackruError
    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. Однако на основе нашего анализа отладки закрытый член workManager внутри WorkManagerTaskExecutor был инициализирован с экземпляром типа 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> 

У нас всерьез заканчиваются идеи, почему workManager внутри WorkManagerTaskExecutor снова инициализируется набором WorkManagerTaskExecutor, что приводит к рекурсии. Может ли сообщество помочь?

0 ответов

Другие вопросы по тегам