2013-07-23 6 views
1

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]; 
       } 

입니다.

답변

1

java.util.concurrent 또는 weblogic과 관련된 문제가 아닙니다. 어떤 웹 로직은 등록 된 스레드 중 하나가 get()이 반환되기를 10 분 이상 기다렸다고합니다.

그럼 왜 반환하지 않았습니까? 제출 한 Callable이 아직 제출되지 않았기 때문입니다. 집행자에게 제출 한 호출 가능 번호를 확인하고 이것이 여전히 call() 방법에있는 이유를 찾아야합니다. 예를 들어

, 나는 그래서 당신은 당신이 제출 한 작업이 아직 완료되지 않은 이유를 볼 필요가

Weblogic-Thread-1 
Future f= e.submit(new Callable(){ 
    public Object call(){ 
     Thread.sleep(700000); 
     return null; 
    } 
}); 

Weblogic-Thread-2 
f.get(); //will sit here and suspend for 700 seconds 

같은 것을 작성하는 경우.

+0

안녕하세요 @ 존, 응답 주셔서 감사합니다, 만약 내가 ApplicationContext를 사용하면 ctx = new ClassPathXmlApplicationContext (filename); ctx.getBean (ptTaskExecutor) 응답에서 지연이 발생하지 않습니다. 빈을 삽입하거나 ApplicationContextAware 또는 '정적 블록을 사용하여 ctx를로드하면'시간 초과 예외가 발생합니다. ClassPathXmlApplicationContext를 사용할 수 없습니다. 성능에 영향을 미칩니다 .DB 로그에 오류/예외가 표시되지 않습니다. db의 Bena 주입 비즈니스 오류로 인해 응답 시간이 올 바르며 올바른 Oparams로 돌아 가야하는 TX가 실패했습니다. – user2609566

+0

프로세스를 실행하고 'kill 3'을 시도해보십시오. 도움이 될 스레드 덤프를 생성합니다. 그렇지 않으면 문제가 무엇인지 말할 수 없습니다. –

+0

빈 대신 시간 제한이 있기 때문에 Java에서 새로운 정적 Threadpool executor 클래스를 사용했습니다. 문제는 대부분 threadpoolexecutor와 SpringBeans2.0 사이에있는 것 같습니다 – user2609566