(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)