写代码的时候经常会有定时任务的需求,例如定时更新数据库的配置文件到内存里面,在clojure下面找了一大圈都是让直接调用java的库,不过还是希望有clojure封装好的库来进行调用,找了半天这个库tools-timer还是比较好用的。

安装

在project.clj里面增加依赖:

[tools-timer "1.0.4"]

在命令行下面执行:

lein deps

自动下载依赖。

使用

在require里面增加timer:

(:require [tools-timer.core :as timer])

run-task!

(run-task! task & {:keys [by at delay period on-exception]})

执行定时任务:

  • task 要执行的函数
  • by timer对象
  • at 在特定的时间执行
  • delay 延迟多久执行(单位是毫秒)
  • period 每隔多久执行一次(单位毫秒)
  • on-exception 异常处理函数,接受一个异常为参数

需要注意的是,如果不提供on-exception函数,那么一个任务里面抛出了异常的时候,这个timer就会被取消。

(def greeting-timer (timer/timer :name "The timer for greeting"))

(defn on-exception [e]
  (println (.toString e)))

(timer/run-task! #(/ 1 0)
                 :period 5000 :by greeting-timer
                 :on-exception on-exception)

有了异常处理函数以后,任务还会继续执行。

cancel!

(cancel! timer)

取消一个timer,同时中断这个timer上的定时任务。

timer

(timer)/(timer :name "xxx")

新建一个timer。

更新历史

2018/08/04

  • 初稿