Spring 3.0+ 自带的任务调度实现,主要依靠TaskScheduler接口的几个实现类实现。删除和修改任务比较麻烦。
主要用法有三种: Spring配置文件实现、注解实现、代码动态添加
配置文件实现
下面展示一些 内联代码片
。
spring-schedule.xml
<task:scheduler id="myScheduler" pool-size="10" />
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="job" method="test" cron="0 * * * * ?"/>
</task:scheduled-tasks>
注解实现
spring-schedule.xml
<task:scheduler id="myScheduler" pool-size="10" />
// 启用注解
<task:annotation-driven scheduler="myScheduler"/>
@Component
public class Task{
@Scheduled(cron="0/5 * * * * ? ") //每5秒执行一次
public void execute(){
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");
}
}
代码动态添加
spring-schedule.xml
<bean id = "myScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="10"/>
<property name="threadGroupName" value="myScheduler" />
<property name="threadNamePrefix" value="-1" />
</bean>
<task:annotation-driven scheduler="myScheduler"/>
@Component
public class Test {
@Autowired
private ThreadPoolTaskScheduler myScheduler;
public void addJob(){
myScheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " run ");
}
} , new CronTrigger("0/5 * * * * ? ")); //每5秒执行一次
}
}
spring 结合 quartz 实现任务调度
spring 配置文件 spring-quartz.xml
<bean id="quartzsScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="triggers">
<list>
<ref bean="testTrigger" />
</list>
</property>
</bean>
<!-- jobClass需要继承QuartzJobBean 也可以使用 MethodInvokingJobDetailFactoryBean 定义任意类任意方法为Job-->
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass">
<value>com.test.TestJob</value>
</property>
<property name="durability" value="true" />
<!-- requestsRecovery属性必须设置为 true,当Quartz服务被中止后,再次启动或集群中其他机器接手任务时会尝试恢复执行之前未完成的所有任务 -->
<property name="requestsRecovery" value="true" />
</bean>
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail" />
<property name="cronExpression" value="0 0 10 * * ?" />
</bean>
动态增加删除
@Component
public class Test {
@Autowired
private SchedulerFactoryBean quartzScheduler;
public void addJob() throws SchedulerException {
Scheduler scheduler = quartzScheduler.getScheduler();
JobKey jobKey = new JobKey("test", "test");
if (scheduler.checkExists(jobKey)) {
return;
}
JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test", "test")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();
scheduler.scheduleJob(jobDetail, trigger);
}
}