spring提供了@scheduled注解来实现定时任务
需要注意的几点:
1、spring的@Scheduled注解 ,需要写在实现上、
2、定时器的任务方法不能有返回值(有返回值的场景去google)
3、定时器是单线程的
优点:实现中出现exception或者error没有捕获的情况,并不会导致线程退出,只会导致本次执行中断退出,下一次还会再执行。
缺点:单线程的情况下,如果有多个方法都被注解了,就会排队执行。
例如,存在run(),test()两个方法,都用注解间隔5s执行一次的方式执行,实际执行会是
run()-5s-test()-5s-run(),也就是说两次执行之间间隔了10s;
如果run()方法执行完毕就要8s,则会呈现run()-8s-test()-5s-run()
两次执行间隔了13s
可以通过改配置的方式实现任务并行执行。
xmlns 多加下面的内容
<xmlns:task="http://www.springframework.org/schema/task" >
xsi:schemaLocation多加下面的内容
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd
然后配置pool-size来设定多少并发
<task:scheduler id="myScheduler1" pool-size="2"/>
如上就会有2个线程来执行定时任务了。
springboot中,通过下面注解来引入xml配置文件
@SpringBootApplication
@EnableScheduling
@ImportResource("classpath*:sch.xml")
@Component("MyTest")
public class MyTest{
……
}
也可以不用@Scheduled注解,直接用xml配置,一个完整的xml示例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
<task:scheduler id="myScheduler1" />
<task:scheduler id="myScheduler2" />
<task:scheduled-tasks scheduler="myScheduler1">
<task:scheduled ref="MyTest" method="test1" fixed-delay="2000"/>
<task:scheduled ref="MyTest" method="test2" fixed-delay="2000"/>
</task:scheduled-tasks>
<task:scheduled-tasks scheduler="myScheduler2">
<task:scheduled ref="MyTest" method="test3" fixed-delay="5000"/>
</task:scheduled-tasks>
</beans>
网友评论