2011-06-18 44 views
1

我試圖創建一個需要作爲屬性傳遞給其他bean的ThreadPoolExecutor bean。創建bean時出錯,無法將一個新的LinkedBlockingQueue作爲構造函數注入到ThreadPoolExecutor中

我已經定義了以下內容,但創建LinkedBlockingQueue時遇到了一個奇怪的錯誤(如下所示)。

<bean name="moduleExecutorService" class="java.util.concurrent.ThreadPoolExecutor"> 
    <constructor-arg value="1" /> <!-- Minimun # of threads in pool --> 
    <constructor-arg value="20" /> <!-- Maximum # of threads in pool (pool is a caching pool that will only keep open those necessary) --> 
    <constructor-arg value="60" /> <!-- Shutdown unused threads after this TimeUnit --> 
    <constructor-arg> 
     <bean class="java.util.concurrent.TimeUnit" factory-method="valueOf"> 
      <constructor-arg value="SECONDS" /> 
     </bean> 
    </constructor-arg> 
    <constructor-arg type="java.util.concurrent.LinkedBlockingQueue"><bean class="java.util.concurrent.LinkedBlockingQueue" /></constructor-arg> 
</bean> 


錯誤:

446 [main] DEBUG org.springframework.beans.TypeConverterDelegate - Cannot create copy of Collection type [java.util.concurrent.LinkedBlockingQueue] - injecting original Collection as-is 
java.lang.InstantiationException: java.util.concurrent.BlockingQueue 
+1

嘗試沒有類型=「...」,或嘗試指定TYPE =「java的.util.concurrent.BlockingQueue」。 –

回答

0

我不明白爲什麼這條消息出現。最後它只是一個DEBUG的消息,它不應該阻止你提出你的應用程序。或者,您可以使用FactoryBean,而不是實例化ThreadPoolExecutor

public class ThreadPoolExecutorFactory implements FactoryBean 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private ThreadPoolExecutor executor; 
    private int corePoolSize; 
    private int maximumPoolSize; 
    private long keepAliveTime; 
    private TimeUnit unit; 

    public Object getObject() 
    { 
     lock.lock(); 
     if (executor == null) 
      executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 
        keepAliveTime, unit, new LinkedBlockingQueue<Runnable>()); 
     lock.unlock(); 
     return executor; 
    } 

    public Class getObjectType() 
    { 
     return ThreadPoolExecutor.class; 
    } 

    public boolean isSingleton()  
    { 
     return true; 
    } 
} 

在你的應用環境,那麼你會創建這樣的豆:在構造帶參數的

<bean name="moduleExecutorService" class="ThreadPoolExecutorFactory"> 
    <constructor-arg value="1" /> 
    <constructor-arg value="20" /> 
    <constructor-arg value="60" /> 
    <constructor-arg> 
     <bean class="java.util.concurrent.TimeUnit" factory-method="valueOf"> 
      <constructor-arg value="SECONDS" /> 
     </bean> 
    </constructor-arg> 
</bean> 
相關問題