通过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,使用例如组件扫描。
我试过你的解决方案,它工作正常。但是,我无法使用它,因为cron作业不固定。用户可以设置它,所以它必须是一个变量,而不是注释。另一方面,我发现问题出在配置文件中:它没有被上下文文件“导入”。谢谢。 – Manu 2013-03-06 02:15:29
我也想让所有的用户分配这个。你弄明白了吗? – 2017-06-22 17:56:34