通过Spring启动异步任务TaskScheduler

通过Spring启动异步任务TaskScheduler

问题描述:

我需要在7.05am执行任务,但出现错误。 这是我创建的控制器。通过Spring启动异步任务TaskScheduler

@Service("myCtr") 
public class MyController { 

    @Autowired 
    private TaskScheduler scheduler; 

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

MyWorker是实现Runnable简单地这样说:

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

    private void doWork() { [...] 

我的调度程序配置文件是由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> 

错误:

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)} 

看起来Spring没有找到你的TaskScheduler bean。

使用INFO日志记录,您应该能够在初始化期间在日志中找到您的bean定义。如果没有,请确保您的配置文件通过进一步的测试有效地读取。

为了您的确切需要,您还可以使用以下命令:

@Service 
public class MyService { 

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

} 

利用这种配置:

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

并假设MyService正确看作是一个bean,使用例如组件扫描。

+1

我试过你的解决方案,它工作正常。但是,我无法使用它,因为cron作业不固定。用户可以设置它,所以它必须是一个变量,而不是注释。另一方面,我发现问题出在配置文件中:它没有被上下文文件“导入”。谢谢。 – Manu 2013-03-06 02:15:29

+0

我也想让所有的用户分配这个。你弄明白了吗? – 2017-06-22 17:56:34