从Spring的@Scheduled说起

通过Spring的@Scheduled可以创建定时任务。

  • 引入 xmlns:task 命名空间;
  • 在task任务执行类引入注解:@Component@EnableScheduling;
  • 配置定时执行任务:@Scheduled(cron = "0/10 * * * * *");

任务执行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秒执行一次。

原文发布于微信公众号 - 服务端技术杂谈(ITIBB2014)

原文发表时间:2018-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端生活

Linux(十)组管理

1594
来自专栏java一日一条

理解Cookie和Session机制

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确...

1401
来自专栏Rgc

redis权限认证及登录

3601
来自专栏云计算与大数据

研发:Idea工具因为版本工具设置问题,导致全是红色

I have the current status of my files in the folders coloured red/brown. I tried...

1273
来自专栏专注研发

linux常用命令

     -a          列出当前目录下所有文件及目录,包括隐藏的a(all)

1781
来自专栏光变

DBCP连接池配置参数说明

DBCP连接池配置参数说明。 bean id=”dataSource” cla… 转自链接:fairyhawk

1642
来自专栏JavaEdge

Cookie与Session基础知识点

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。 Cookie通过在客户端记录信...

46711
来自专栏张善友的专栏

Windows安装和使用zookeeper

之前整理过一篇文章《zookeeper 分布式锁服务》,本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http:...

2379
来自专栏web编程技术分享

第八节 - 部门管理模块(编写PHP程序)

32710
来自专栏Java帮帮-微信公众号-技术文章全总结

Linux常用命令

Linux常用命令 常用指令 ls   显示文件或目录 -l 列出文件详细信息l(list) -a ...

4966

扫码关注云+社区

领取腾讯云代金券