Weblogic 10.3, Spring 2.0, Oracle 11g를 사용하고 있습니다. 'threadpoolexecutor'미래의 작업 (async resp)을 사용하려고 할 때, 비동기 응답을 기다리는 데 다음과 같은 예외가 발생합니다. 스레드 풀 실행자가 실행하는 bean이 '프로토 타입'인 경우ThreadPoolExecutor Spring Bean injection-Spring-beans-2.0을 이용한 미래 태스크 -
참고 : Spring 's Bean을 가져 오는 ClassPathXmlApplicationContext 예외를 얻지는 않습니다. 빈을 다시로드 할 때 선호하는 방법이 아닙니다.
나는 springContextAware, ApplicationObjectSupport를 시도했다. 그것들도 나를 위해 일하지 않았다.
- Error:
]", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
내가 가진 빈 정의는 내가 threadpoolexecutor
에 또한 lazy-init=true
, 운없이 시도
<bean id="PtTaskExecutor"
class="java.util.concurrent.ThreadPoolExecutor">
<constructor-arg index="0" value="1"/> <!-- corePoolSize -->
<constructor-arg index="1" value="3"/> <!-- maximumPoolSize -->
<constructor-arg index="2" type="long" value="180"/><!-- 3 minutes -->
<!-- keepAliveTime -->
<constructor-arg index="3" type="java.util.concurrent.TimeUnit">
<!-- the time unit for the keepAliveTime argument -->
<util:constant static-field="java.util.concurrent.TimeUnit.SECONDS"/>
</constructor-arg>
<constructor-arg index="4" type="java.util.concurrent.BlockingQueue">
<!-- the queue for holding tasks before they are executed -->
<bean name="LinkedBlockingQueue" class="java.util.concurrent.LinkedBlockingQueue">
<constructor-arg index="0" type="int" value="3"/> <!-- capacity -->
</bean>
</constructor-arg>
<constructor-arg index="5" type="java.util.concurrent.RejectedExecutionHandler">
<!--Execute with caller threads if queue is full -->
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
</constructor-arg>
</bean>
<bean id="xTask" class="***.****.*.*.*.*.XTask" scope="prototype">
<property name="XDao" ref="XDao" />
<property name="transactionTemplate" ref="transactionTemplate"/>
</bean>
-----The code part
Future<YResponseBean[]> responseArr = pTaskExecutor
.submit(xTask);
responseMap.put(i, responseArr);
then the error is from here
for (Integer i : keySet) {
// Waits for the thread response
responses[i] = responseMap.get(i).get()[0];
}
입니다.
안녕하세요 @ 존, 응답 주셔서 감사합니다, 만약 내가 ApplicationContext를 사용하면 ctx = new ClassPathXmlApplicationContext (filename); ctx.getBean (ptTaskExecutor) 응답에서 지연이 발생하지 않습니다. 빈을 삽입하거나 ApplicationContextAware 또는 '정적 블록을 사용하여 ctx를로드하면'시간 초과 예외가 발생합니다. ClassPathXmlApplicationContext를 사용할 수 없습니다. 성능에 영향을 미칩니다 .DB 로그에 오류/예외가 표시되지 않습니다. db의 Bena 주입 비즈니스 오류로 인해 응답 시간이 올 바르며 올바른 Oparams로 돌아 가야하는 TX가 실패했습니다. – user2609566
프로세스를 실행하고 'kill 3'을 시도해보십시오. 도움이 될 스레드 덤프를 생성합니다. 그렇지 않으면 문제가 무엇인지 말할 수 없습니다. –
빈 대신 시간 제한이 있기 때문에 Java에서 새로운 정적 Threadpool executor 클래스를 사용했습니다. 문제는 대부분 threadpoolexecutor와 SpringBeans2.0 사이에있는 것 같습니다 – user2609566