文档章节

编写定时任务的几种方式

凯尔特Queen
 凯尔特Queen
发布于 2017/11/28 11:29
字数 679
阅读 34
收藏 0

1.Thread.sleep(),让线程休眠挂起,等待一段时间后再执行,可参考如下代码:

		// 提前的业务逻辑 xxx
		try { 
			Thread.sleep(2000); // 睡眠2s
		} catch(Exception e){
			// ...
		}
		// 定时任务的业务逻辑

2.利用java.util包下的Timer和TimerTask, TimeTask抽象类实现了Runnable接口,只需要封装一下TimerTask类,再结合Timer类中schedule(....)方法,即可实现定时任务,可参考如下代码使用:

		new Timer("schedued").schedule(new TimerTask(){
			@Override
			public void run() {
				System.out.println("test Timer Task");
			}
		}, 100, 10000);

3.利用线程池:Executors提供几种创建线程池的方式,当然除了常见的创建固定大小的线程池之外,还有个就是通过ScheduledExecutorService来实现定时任务调度。

借助Executors#newScheduledThreadPool来实现定时任务非常简单,如下所示:

		ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); // 获取线程池
		executorService.scheduleAtFixedRate(new Runnable() {
		    @Override
		    public void run() {
		        System.out.println("task: " + System.currentTimeMillis());
		    }
		}, 100, 100, TimeUnit.MILLISECONDS); // 100ms后,首次执行,然后每个100ms执行一次

实际上和Timer的方法类似

4.借助spring,spring提供了强大的功能,支持注解的配置方式,配置完成后在对应的方法上加上注解即可实现定时任务,但是不得不提一下cron表达式,它是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域都代表一个含义,是spring task的强大功能,常见的cron表达式可参考另一篇博客:定时任务实现(Spring注解),部分功能代码用法如下:

配置文件XML:

业务逻辑:

@Component
public class ScheduleDemo {
    @Scheduled(cron = "0 0 5 * * ?")
    public void checkData() {
        System.out.println(" 校验: " + System.currentTimeMillis());
    }
    @Scheduled(cron = "0 0 6 * * ?")
    public void alarm(){
        System.out.println(" 报警: " + System.currentTimeMillis());
    }
}

5.使用LTS任务调度,LTS主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务。有较好的伸缩性,扩展性。代码也很简单,参考如下:

配置好LTS的环境:

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableLTSScheduling(configLocation = "classpath:/lts.properties")
public class JobConfig {
	@Bean
	public OneOffJobClient oneOffJobClient(){
		
		return new OneOffJobClient();
	}
}

引用提交任务:

    @Scheduled(cron = "0 01 0 1 * ?") //每月的1号0点1分
    @JobRunnerItem(shardValue = "efmt.company.savePositionHistoryRecords")
    public void queryCompanyAssets(){
    	positionDomain.savePositionHistoryRecords();
    }

 使用小建议

不推荐使用 Thread#sleep的方式做定时任务

如指向利用jdk实现定时任务,可以考虑 Timer 和 ScheduledExecutorService

如项目本身就利用到了Spring,可以优先考虑优秀的框架提供的服务,如LTS

本文参考连接:https://my.oschina.net/u/566591/blog/1579950

 

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: Linux命令
下一篇: MySQL搜索引擎
凯尔特Queen
粉丝 40
博文 24
码字总数 6242
作品 0
浦东
程序员
私信 提问
Spring定时任务的几种实现

Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,...

如月王子
2014/07/12
0
0
Spring定时任务的实现

Spring定时任务的几种实现 项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,...

钟声已经敲响
2016/08/25
92
0
Quartz实现JAVA定时任务的动态配置

先说点无关本文的问题,这段时间特别的不爽,可能有些同学也遇到过。其实也可以说是小事一桩,但感觉也是不容忽视的。我刚毕业时的公司,每个人每次提交代码都有着严格的规范,像table和spa...

小卖铺的老爷爷
2018/07/24
0
0
使用Bmob Java云函数统计数据

云函数简介 云函数是一段部署在服务端的代码片段,通过云函数可以解决很多复杂的业务逻辑,无需将大量的数据发送到客户端做计算处理,大大减轻了客户端业务开发的复杂度。 另外,更新云函数代...

2017/12/28
0
0
java5线程并发库的应用

一、线程池 1、线程池的概念与Executors类的应用 > 创建固定大小的线程池 > 创建缓存线程池 > 创建单一线程池(如何实现线程死掉后重启?) 2、关闭线程池 > shutdown与shutdownNow的比较 前者...

哎小艾
2018/01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ruby中的继承、原型、面向对象、访问域

先有类还是先有对象 从鸡蛋悖论解决可以悟到一个道理,不要从常识上假设非此即彼和绝对静止。 Ruby中的类和对象正是这么个东西 我们创建一个类,那它就是Class这个对象的实例,而Class,于是...

可数局部基
21分钟前
0
0
什么时候使用字节流、什么时候使用字符流,二者的区别

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 InputStream 和OutputStream,...

watermelon11
今天
6
0
Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
今天
5
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
今天
5
0
Django学习笔记-从创建虚拟环境到启用服务

1 前置条件 windows系统下,目前已经完成anaconda3或miniconda3的安装,这也意味着已经完成了python3的安装。 2 创建虚拟环境 1、通过Anaconda Prompt,使用conda命令创建虚拟环境(base) e...

davidwbnu
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部