2016-08-12 3 views
1

Я пытаюсь создать боб java.util.concurrent.ThreadPoolExecutor, ниже того, что у меня в весеннем конфигурационном файле:не в состоянии создать боб java.util.concurrent.ThreadPoolExecutor с использованием Spring

<bean id="threadPoolExector" class="java.util.concurrent.ThreadPoolExecutor" lazy-init="true" scope="singleton"> 
    <property name="corePoolSize" value="${corePoolSize}"/> 
    <property name="maximumPoolSize" value="${maximumPoolSize}"/> 
    <property name="keepAliveTime" value="${keepAliveTime}"/> 
    <property name="unit" value="java.util.concurrent.TimeUnit.SECONDS"/> 
    <property name="workQueue" ref="abcBlockingQueueImpl"></property> 
</bean> 

<bean id="abcBlockingQueueImpl" class="my.package.AbcBlockingQueueImpl" lazy-init="true" scope="singleton"/> 

Тогда я пытаюсь создать, как показано ниже:

ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) applicationContext.getBean("threadPoolExector"); 

но я получаю ниже исключения, я знаю, что нет нет-Arg для ThreadPoolExecutor, но я удивлен, что я получаю это исключение.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'threadPoolExector' defined in ServletContext resource [/WEB-INF/context/web-applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.concurrent.ThreadPoolExecutor]: No default constructor found; nested exception is java.lang.NoSuchMethodException: java.util.concurrent.ThreadPoolExecutor.&lt;init>() 

Я раньше использовал бобы весны, но это выглядит как странная проблема.

ответ

1

Проблема в конце:

... No default constructor found; ... 

ThreadPoolExecutor не имеет конструктор по умолчанию, вы должны имитировать то, что вы описали в коде: установка аргументы конструктора, по крайней мере, самый маленький конструктор, используя <constructor-arg> теги вместо <property> теги:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 

В файле контекста XML:

<bean id="threadPoolExector" class="java.util.concurrent.ThreadPoolExecutor" lazy-init="true" scope="singleton"> 
    <constructor-arg index="0" type="int" value="${corePoolSize}"/> 
    <constructor-arg index="1" type="int" value="${maximumPoolSize}"/> 
    <constructor-arg index="2" type="long" value="${keepAliveTime}"/> 
    <constructor-arg index="3" type="java.util.concurrent.TimeUnit" value="java.util.concurrent.TimeUnit.SECONDS"/> 
    <constructor-arg index="4" ref="abcBlockingQueueImpl"/> 
</bean> 
+0

Да, я получил это, но даже если я продолжу «ThreadPoolExecutor», у меня все равно будет такая же проблема, и я не хочу создавать экземпляр «ThreadPoolExecutor» вручную или иметь «ThreadPoolExecutor» как экземпляр класса. Можно что-то сделать, я не получаю никакого выхода, кроме 2 того, о чем я говорил выше, чего я не хочу делать. – hagrawal

+0

@hagrawal не нужно ничего расширять. Просто установите свойства с помощью конструктора-args, как и в Java-коде. (отредактированный ответ, чтобы показать его) – ppeterka

+0

Хорошо, дайте 20 минут, я вернусь и попробую. – hagrawal

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