2013-03-05 1 views
0

Je dois exécuter une tâche à 7h05 mais une erreur se produit. C'est le contrôleur que j'ai créé.Démarrage d'une tâche asynchrone via Spring TaskScheduler

@Service("myCtr") 
public class MyController { 

    @Autowired 
    private TaskScheduler scheduler; 

    @Async 
    public void executeTaskT() { 
     scheduler.schedule(new MyWorker(), 
          new CronTrigger("5 7 * * *")); 
     } 
} 

MyWorker met en œuvre Runnable simplement de cette façon:

[...] 
    @Override 
    public void run() { 
     doWork(); 
    } 

    private void doWork() { [...] 

Mon fichier de configuration du planificateur est importé par l'application Web-config.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 

<bean id="TaskScheduler" 
class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> 
    <property name="waitForTasksToCompleteOnShutdown" value="true" /> 
    <property name="poolSize" value="1000" /> 
</bean> 

</beans> 

L'erreur:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MyCtr': Injection 
of autowired dependencies failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private 
org.springframework.scheduling.TaskScheduler [...].MyController.scheduler; nested 
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type 
[org.springframework.scheduling.TaskScheduler] 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)} 
[...] 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private 
org.springframework.scheduling.TaskScheduler [...].MyController.scheduler; nested 
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type 
[org.springframework.scheduling.TaskScheduler] 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)} 
[...] 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type 
[org.springframework.scheduling.TaskScheduler] 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)} 

Répondre

3

Il semble que Spring ne trouve pas votre haricot TaskScheduler. Avec la journalisation INFO, vous devriez pouvoir trouver la définition de votre bean dans le journal pendant l'initialisation. Sinon, assurez-vous que votre fichier de configuration est effectivement lu en effectuant d'autres tests.

Pour votre besoin précis, vous pouvez également utiliser les éléments suivants:

@Service 
public class MyService { 

    @Scheduled(cron = "0 5 7 * * *") 
    public void myMethod() { ... } 

} 

Avec cette configuration:

<task:annotation-driven scheduler="myScheduler"/> 
<task:scheduler id="myScheduler" pool-size="1000"/> 

Et en supposant MyService est bien considéré comme un haricot, en utilisant par exemple Composant Scan.

+1

J'ai essayé votre solution et cela fonctionne très bien. Cependant, je ne peux pas l'utiliser, car le travail cron n'est pas corrigé. L'utilisateur peut le définir, il doit donc être une variable, pas dans une annotation. De l'autre côté, j'ai compris que le problème était dans le fichier de configuration: il n'était pas "importé" par le fichier de contexte. Merci. – Manu

+0

Je voudrais aussi que tout le monde l'attribue. Avez-vous compris? –

Questions connexes