2012-12-04 25 views
1

我需要在不同線程中執行Controller中的一些代碼。Spring MVC如何使用控制器中的AsyncTaskExecutor

我的結構:

@Controller 
MyController 

    //invoked from frontend 
    @RequestMapping 
    MyMethod 
     Loop 
      future = asyncTaskExecutor.Submit(callable) 
     End loop 
     Get future results 
    End MyMethod 

我使用就像這個例子AsyncTaskExecutor:

Any good Spring threading with a TaskExecutor examples?

public SendEmailController() {} 

public SendEmailController(AsyncTaskExecutor asyncTaskExecutor) { 
super(); 
this.asyncTaskExecutor = asyncTaskExecutor; 
} 

的applicationContext.xml:

<bean id="sendEmailController" class="com.ts.bpu.email.web.SendEmailController"> 
    <constructor-arg ref="asyncTaskExecutor" /> 
</bean> 

<bean id="asyncTaskExecutor" 
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 

但是永遠不會使用參數的構造函數。但是,如果我只用了構造函數參數異常跟蹤是:

GRAVE: WebModule[/TsSecPricesEngineWeb]StandardWrapper.Throwable 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sendEmailController' defined in file [C:\Sun\AppServer\domains\domain1\applications\j2ee-modules\TsSecPricesEngineWeb\WEB-INF\classes\com\ts\bpu\email\web\SendEmailController.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ts.bpu.email.web.SendEmailController]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.ts.bpu.email.web.SendEmailController.<init>() 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) 
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) 
at javax.servlet.GenericServlet.init(GenericServlet.java:270) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1194) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:848) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) 
at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ts.bpu.email.web.SendEmailController]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.ts.bpu.email.web.SendEmailController.<init>() 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:70) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958) 
... 44 more 

Caused by: java.lang.NoSuchMethodException: com.ts.bpu.email.web.SendEmailController.<init>() 
at java.lang.Class.getConstructor0(Class.java:2706) 
at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:65) 
... 45 more 

什麼建議嗎?

謝謝

+0

如果構造函數從未被調用過,那可能意味着bean永遠不會被創建。你可以聲明一個默認的構造函數,看看是否被調用。如果兩個都沒有被調用,那麼你的應用上下文沒有被加載 –

+0

我試過的選項是:使用兩個構造函數,一個不帶參數,另一個帶asyncTaskExecutor作爲參數。有了這個選項,以及像我所顯示的applicationContext.xml,第二個構造函數從來沒有被使用過 –

+0

但是第一個是? –

回答

0

當Spring容器啓動時,它會調用你的SendEmailController類的構造函數。

+0

是的,我知道它,是否有替代獲得asyncTaskExecutor的實例? –