2014-03-19 27 views
2

我會使新線程在後臺工作。我試圖使用@Async和任務:註解驅動,但應用程序不工作。@Async和任務:註解驅動不起作用

根的context.xml

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

<context:component-scan base-package="com.cebul.jez.model, com.cebul.jez.service, com.cebul.jez.useful, com.cebul.jez.flows, com.cebul.jez.asynch" /> 

<task:annotation-driven executor="myExecutor" scheduler="myScheduler" /> 

AsyncWorker.java

@Service 
public class AsyncWorker { 

    @Async 
    public void work() { 
     String threadName = Thread.currentThread().getName(); 
     while(true) 
     { 
      System.out.println(" " + threadName + " work"); 
        try { 
         Thread.sleep(30000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
     } 
    } 
    public void cancel() { Thread.currentThread().interrupt(); } 
} 

在控制器中,我使用它是這樣的:

@RequestMapping(value = {"/", "/home"}) 
    public String home(Model model, HttpSession session){ 


     asyncWorker.work(); 

      //other code 
} 

如果我嘗試運行它,我有例外:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cebul.jez.asynch.AsyncWorker com.cebul.jez.controllers.HomeController.asyncWorker; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cebul.jez.asynch.AsyncWorker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    ... 34 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cebul.jez.asynch.AsyncWorker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
    ... 36 more 
2014-03-19 13:02:05 org.apache.catalina.core.StandardContext loadOnStartup 
SEVERE: Servlet /jez threw load() exception 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cebul.jez.asynch.AsyncWorker] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5027) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:655) 
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1628) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

如果我刪除註釋驅動代碼complie並運行,但AsyncWorker任務BLOCK應用程序,所以AsyncWorker任務不會異步運行。

你能告訴我問題在哪裏嗎?

+0

做你'AsyncWorker'實現任何接口

你有兩個選擇?你如何將它注入你的控制器? – axtavt

+0

我像這樣注入它:@Autowired \t private AsyncWorker asyncWorker; – user2987020

+0

我試過了:public class AsyncWorker implements Worker,其中Worker:public interface Worker {public void work(); public void cancel(); } – user2987020

回答

4

因此,您的AsyncWorker實現了一個接口。

@Async方面與其他Spring方面具有相同的侷限性,例如@Transactional。默認情況下,如果將其應用於實現接口的類,Spring生成的AOP代理將實現該接口,但不會擴展該類本身,以便它不能被注入到AsyncWorker類型的字段中。注射時

  • 使用界面:

    @Autowired private Worker asyncWorker 
    
  • 使用proxy-target-class

    <task:annotation-driven 
        executor="myExecutor" scheduler="myScheduler" 
        proxy-target-class="true"/> 
    
+0

非常感謝。不工作:) – user2987020