2013-07-23 3 views
1

Я использую Weblogic 10.3, Spring 2.0, Oracle 11g. При попытке использовать будущую задачу «threadpoolexecutor» (async resp), я получаю следующее исключение в ожидании асинхронного ответа, когда в качестве компонента, выполняемого исполнителем пула потоков, является «прототип»ThreadPoolExecutor Future Task -exception с пружинной фазой-spring-beans-2.0

Примечание: когда я использую Spring ClassPathXmlApplicationContext для получения компонента Я не получаю исключения, что не является предпочтительным способом получения bean-компонентов, поскольку он снова загружает все компоненты.

Я пробовал 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) 

Определение фасоли у меня есть

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

Я попытался с lazy-init=true также на threadpoolexecutor, не повезло.

ответ

1

Проблема не в том, что происходит от java.util.concurrent или weblogic. Что веб-журнал говорит вам, так это то, что один из его зарегистрированных потоков ожидал дольше 10 минут для возврата get().

Так почему же он не вернулся? Это потому, что отправленный вами 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

Привет @John, спасибо за ответ, меня смущает, если я использую ApplicationContext ctx = new ClassPathXmlApplicationContext (filename); ctx.getBean (ptTaskExecutor) Я не получаю задержки в ответе. Если я вставляю компонент или использую ApplicationContextAware или «статический блок для загрузки ctx один раз», я получаю исключение тайм-аута. Я не могу использовать ClassPathXmlApplicationContext, поскольку он влияет на эффективность. В журналах DB не отображаются какие-либо ошибки/исключения. С ошибками бизнес-инъекции bena от db в ответ вовремя верны только те TX, которые необходимо вернуть с помощью Oparams. – user2609566

+0

Попробуйте запустить и «убить 3» процесс. Он будет генерировать дамп потока, который может помочь. В противном случае сложно сказать, в чем проблема. –

+0

из-за ограничений по времени вместо bean-компонента. Я использовал новый статический класс-исполнитель Threadpool в java, похоже, проблема в основном связана с threadpoolexecutor и SpringBeans2.0. – user2609566

 Смежные вопросы

  • Нет связанных вопросов^_^