通过Spring的@Scheduled可以创建定时任务。
任务执行task:
@Component@EnableSchedulingpublic class TestDaemon { @Scheduled(cron = "0/10 * * * * *") public void testRunTask(){ try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
DateFormat df = new SimpleDateFormat("HH:mm:ss");
System.out.println(df.format(new Date()) + "********A任务每10秒执行一次进入测试");
}
} @Scheduled(cron = "0/5 * * * * *") private void fullQueueTask() {
System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date()) + "********B任务每5秒执行一次进入测试");
}
跑起来:
13:21:25********B任务每5秒执行一次进入测试
13:21:30********B任务每5秒执行一次进入测试
13:21:50********A任务每10秒执行一次进入测试
13:21:50********B任务每5秒执行一次进入测试
13:21:55********B任务每5秒执行一次进入测试
13:22:00********B任务每5秒执行一次进入测试
13:22:20********A任务每10秒执行一次进入测试
13:22:20********B任务每5秒执行一次进入测试
13:22:25********B任务每5秒执行一次进入测试
我们发现B并没有每隔5秒钟执行,而是当A任务启动后,B任务需要等待A任务执行完成之后继续执行。 这是因为默认的@Scheduled是单线程执行的,所有任务需要互相排队。
我们在业务上肯定需要不同调度任务有自己的节奏,单线程是满足不了了,Spring为我们提供了多线程的调度方式。
XML:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<task:annotation-driven scheduler="myScheduler" />
<!-- 配置任务线程池 -->
<task:scheduler id="myScheduler" pool-size="5" /></beans>
引入xml:
<import resource="server-task.xml" />
再次执行:
13:26:00********B任务每5秒执行一次进入测试
13:26:05********B任务每5秒执行一次进入测试
13:26:10********B任务每5秒执行一次进入测试
13:26:15********B任务每5秒执行一次进入测试
13:26:20********B任务每5秒执行一次进入测试
13:26:20********A任务每10秒执行一次进入测试
13:26:25********B任务每5秒执行一次进入测试
13:26:30********B任务每5秒执行一次进入测试
13:26:35********B任务每5秒执行一次进入测试
13:26:40********B任务每5秒执行一次进入测试
13:26:45********B任务每5秒执行一次进入测试
13:26:50********A任务每10秒执行一次进入测试
13:26:50********B任务每5秒执行一次进入测试
13:26:55********B任务每5秒执行一次进入测试
我们发现B任务是按照自己的节奏进行,每隔5秒执行一次。