From 67d043750eb678ab9a2607160e55ef5fa1e070a4 Mon Sep 17 00:00:00 2001 From: sostler Date: Tue, 13 Apr 2010 07:26:23 -0400 Subject: Added scheduled-agent --- src/scheduled_agent.clj | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/scheduled_agent.clj (limited to 'src') diff --git a/src/scheduled_agent.clj b/src/scheduled_agent.clj new file mode 100644 index 0000000..702b314 --- /dev/null +++ b/src/scheduled_agent.clj @@ -0,0 +1,31 @@ +(ns scheduled-agent + (:import java.util.concurrent.Executors + java.util.concurrent.TimeUnit) + (:use clojure.stacktrace)) + +(defn- runnable-proxy [f] + (proxy [Runnable] [] (run [] (f)))) + +(defn scheduled-agent + [func period init] + (let [pool (Executors/newScheduledThreadPool 1) + r (ref init) + pfunc (runnable-proxy (fn [] + (try + (dosync + (ref-set r (func (ensure r)))) + (catch Exception e + (print-stack-trace e 5))))) + future (.scheduleWithFixedDelay pool pfunc 0 period TimeUnit/SECONDS)] + {:pool pool + :data r + :future future + :func pfunc + :period period + :init init})) + +(defn cancel [{f :future}] + (.cancel f false)) + +(defn poll [{d :data}] + @d) -- cgit v1.2.3-70-g09d2