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