定时器(quartz一)与spring集成、动态添加任务
定时器(quartz 一)
优点:与spring集成、动态添加任务、支持集群
定时器(quartz一)与spring集成、动态添加任务
定时器(quartz一)与spring集成、动态添加任务
定时器(quartz一)与spring集成、动态添加任务
缺点:不支持分布式(只能一个任务在一台上执行,不能分片)
将一个任务拆分成多个的任务项,由分布式的分别执行某一个或几个分片项。而传统的定时器任务都在一台上执行,如果数据很大那么压力很大。
举例:处理一百万的订单:A处理尾数偶数的订单,B处理尾数奇数的订单。
整合ja项目
1、引入quartz 依赖
2、quartz.properties
3、
注意:
1、每一个job执行都是一个新的线程(即使是同一个任务,这个elastic-job不同)但是如果在配置文件quartz.properties中配置的线程消耗完,也还是会陷入阻塞的。根据业务来预估线程池的大小。(所以的任务共享一个线程池)
2、每一个job执行都会创建一个新的job对象,所以想通过job的成员变量来传递信息是不可行的(每次都会初始化)
3、myJob类必须要有空的构造方法
1、方式1:在创建jobDetail是传递JobDataMap,然后通过JobExecutionContext获取JobDataMap
2、方式2:在myjob中定义成员变量,并生成get,set方法
上面我们知道任务间都是并发处理的,那么要考虑并发安全问题。
1、使用@DisallowConcurrentExecution
使用@PersistJobDataAfterExecution注解和jobDataMap.put方法
1、startTime属性:设置trigger次触发的时间
2、endTime属性:表示trigger的失效时间点
3、优先级(priority)当多个Trigger并发执行,但是线程不够时触发,会优先执行级别高的Trigger
TriggerBuilder.newTrigger().withPriority(10);
默认时5,数字越大优先级越高
4、错过触发(misfire instructions)
1、withMisfireHandlingInstructionDoNothing策略:错过了什么都不做,等待下一次触发时间
设置每5秒执行一次,任务7秒。
发现这样是不会生效的,因为内部判断了一下错过的时间是否大于misfireThreshold这个值(默认5秒),如果小于还是立即执行。这里我们只失效了2秒,是小于5秒的。
通过quartz.properties设置misfireThreshold的值
这样再运行,发现withMisfireHandlingInstructionDoNothing策略生效了。
2、withMisfireHandlingInstructionFireAndProceed策略:错过立即执行
5、日历(calendar)
1、可以在具体的时间点执行一次
2、可以按照指定间隔时间重复若干次
1、使用cron表达式触发
, 代表并且,如果10,20 10秒和20秒都指向
? 只能出现在日期和星期内,代表没有特定的值。如果使用号日期了星期会有歧义,这是使用?
L 只能出现在日期和星期内,表示月的后一天,或者星期六
W 只能出现在日期内,表示接近这个日期的工作日
ja的几种定时任务
ja定时任务有三种:
- JDK自带 :JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorServ;
- Quartz :简单却强大的JAVA作业调度框架
- Spring3.0以后自带的task :可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多;
代码参考:
JDK 自带的定时器实现
schedule(TimerTask task, Date time) 特定时间执行
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
new Timer("timer - " + i).schedule(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}}, new Date(System.currentTimeMillis() + 2000));
}}
Quartz 定时器实现
2.1 通过men引入依赖(这里主要介绍2.3.0) 注意:shiro-scheduler中依赖的是1.x版本 如果同时使用会冲突
2.2 创建Job类
public class TestJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr());
}}
2.3 调度任务
public static void main(String[] args) throws InterruptedException, SchedulerException { Scheduler scheduler = new StdSchedulerFactory().getScheduler();
// 开始
scheduler.start();
// job 标识 test.test-1
JobKey jobKey = new JobKey("test" , "test-1");
JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();
Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("test" , "test")
// 延迟一秒执行
.startAt(new Date(System.currentTimeMillis() + 1000))
// 每隔一秒执行 并一直重复
.withSchedule(SimpleScheduleBuilder.Schedule().withIntervalInSeconds(1).repeatForr())
.build();
scheduler.scheduleJob(jobDetail , trigger);
Thread.sleep(5000);
// 删除job
scheduler.deleteJob(jobKey);
}3.Spring 相关的任务调度
3.1 配置文件实现
spring-schedule.xml
3.2注解实现
spring-schedule.xml
// 启用注解
@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秒执行一次进入测试");
}}
Quartz定时器 无法启动
照这个配置 后加上triggers
Spring 定时器 使用quartz 报错问题 Error creating bean with name 'reportTask' defined in file 求解
1、首先步就是进行看一下报错的详细信息,如下图所示,这个是Spring MVC的一个注解,所以这个错误肯定和Controller之中的autowired注解相关。
2、接着就是它显示我们是在tnDevServ之中报错的,这时候serv层或者是Dao层的错误。下面是我们的sev报错以及controller相关的位置即可。
3、然后就是一定需要有@controller注解以及@autowired注解。而Serv层以及Dao层需要分别有@Serv以及@Dao注解,如下图所示。
4、接着从上图,可以看到缺少了相关的serv层的@serv注解,因为Serv层可能会拥有一个impl这个接口,而@serv只需要在接口上加注解即可。
5、然后就是进行打开impl文件,然后加上所需要的@serv注解,就可以成功运行了,然后打开impl文件,以及加上@serv注解即可。
6、后程序可以成功运行起来了没有了报错了,如下图所示。
Timer和spring的Quartz两种定时器的区别
您好,我来为您解答:
这近闲暇无事,研究定时器timer和Quartz。也在网上看了一些例子,大多数要不是讲得很笼统就是就得很深奥。仔细想来定时器不就是相当于定时触发的装置,这样想来理解就更容易了。
1. Ja定时器没有持久化机制。
2. Ja定时器的日程管理不够灵活(只能设置开始时间、重复的间隔,设置特定的日期、时间等)//这点感同身受
3. Ja定时器没有使用线程池(每个Ja定时器使用一个线程)//想必在用timer是遇到了吧。
4. Ja定时器没有切实的管理方案,你不得不自己完成存储、组织、恢复任务的措施
希望我的回答对你有帮助。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。