有什么方式实现实时任务?

有什么方式实现实时任务?

1、Java中的几种实现方式

1.1、Timer类
public class TestTimer {
    static int i = 0;

    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行任务:" + i++);
            }
        };
        Timer timer = new Timer();
        timer.schedule(timerTask, 10, 3000);
    }
}
1.2、ScheduledExecutorService
    public void schedule() {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(() -> 
        System.out.println("定时执行"), 0, 3, TimeUnit.SECONDS);
    }
1.3、利用spring的@Schedule( cron = “0 0/10 * * * ?” )

(在使用zset中代码示例)

1.4、DequeQueue

实现Deque接口。使用DequeQueue延时队列

2、redis使用zset

在Redis中,zet作为有序集合,可以利用其有序的特性,将任务添加到zset中,将任务的到期时间作为score,利用zset的默认有序特性,zrangewithscores可以获取score值最小的元素(也就是最近到期的任务),判断系统时间与该任务的到期时间大小,如果达到到期时间,就执行业务,并删除该到期任务,继续判断下一个元素,如果没有到期,就sleep一段时间(比如1秒),如果集合为空,也sleep一段时间。

附: 简单的延时队列的需求:如何实现对下单超过15分钟没有支付的订单进行取消操作

1、使用zset数据结构存储,订单号为key,时间为score。
2、新增订单的时候,将订单号插入zset。
3、设定轮询,每分钟轮询一次zset,找出score小于当前秒数的数据,进行处理,然后将key在zset内删除。

创建定时任务:

@Component
@EnableScheduling
public class ScheduleTask {
    @Autowired
    private RedisTemplate redisTemplate;

    @Scheduled(cron = "* * * * * *")
    public void schedule() {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        Set<String> task = zSetOperations.
            rangeByScore("task", 0, System.currentTimeMillis());
        Iterator<String> iterator = task.iterator();
        while (iterator.hasNext()) {
            String curTask = iterator.next();
            System.out.println(curTask);
            zSetOperations.remove("task", curTask);
        }
    }

}

增加延时任务:

    @ResponseBody
    @GetMapping("/addTask")
    public String redisAddTask(Long time, String taskName) {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        zSetOperations.add("task", taskName, System.currentTimeMillis() + time);
        return taskName;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值