赞
踩
在开发中,往往会遇到一些关于延时任务的需求。例如
对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别
下面,我们以判断订单是否超时为例,进行方案分析
(1)数据库轮询
思路
该方案通常是在小型项目中使用,即通过一个线程定时地去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作
实现
博主当年早期是用quartz来实现的(实习那会的事),简单介绍一下
maven项目引入一个依赖如下所示
- <dependency>
- <groupId>org.quartz-scheduler</groupId>
- <artifactId>quartz</artifactId>
- <version>2.2.2</version>
- </dependency>
调用Demo类MyJob如下所示
- package com.rjzheng.delay1;
- import org.quartz.JobBuilder;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerException;
- import org.quartz.SchedulerFactory;
- import org.quartz.SimpleScheduleBuilder;
- import org.quartz.Trigger;
- import org.quartz.TriggerBuilder;
- import org.quartz.impl.StdSchedulerFactory;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
-
- public class MyJob implements Job {
- public void execute(JobExecutionContext context)
- throws JobExecutionException {
- System.out.println("要去数据库扫描啦。。。");
- }
-
- public static void main(String[] args) throws Exception {
- // 创建任务
- JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
- .withIdentity("job1", "group1").build();
- // 创建触发器 每3秒钟执行一次
- Trigger trigger = TriggerBuilder
- .newTrigger()
- .withIdentity("trigger1", "group3")
- .withSchedule(
- SimpleScheduleBuilder.simpleSchedule()
- .withIntervalInSeconds(3).repeatForever())
- .build();
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- // 将任务及其触发器放入调度器
- scheduler.scheduleJob(jobDetail, trigger);
- // 调度器开始调度任务
- scheduler.start();
- }
- }
运行代码,可发现每隔3秒,输出如下
要去数据库扫描啦。。。
优缺点
优点:简单易行,支持集群操作
缺点:(1)对服务器内存消耗大
(2)存在延迟,比如你每隔3分钟扫描一次,那最坏的延迟时间就是3分钟
(3)假设你的订单有几千万条,每隔几分钟这样扫描一次,数据库损耗极大
思路
该方案是利用JDK自带的DelayQueue来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。
DelayedQueue实现工作流程如下图所示
其中Poll():获取并移除队列的超时元素,没有则返回空;take():获取并移除队列的超时元素,如果没有则wait当前线程,直到有元素满足超时条件,返回结果。
实现
定义一个类OrderDelay实现Delayed,代码如下
- package com.rjzheng.delay2;
-
- import java.util.concurrent.Delayed;
- import java.util.concurrent.TimeUnit;
-
- public class OrderDelay implements Delayed {
-
- private String orderId;
- private long timeout;
-
- OrderDelay(String orderId, long timeout) {
- this.orderId = orderId;
- this.timeout = timeout + System.nanoTime();
- }
-
- public int compareTo(Delayed other) {
- if (other == this)
- return 0;
- OrderDelay t = (OrderDelay) other;
- long d = (g
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。