2011-06-27 19 views
7

鑑於STM擁有10個參考值,代理等歷史記錄,可以讀取這些值嗎?可以訪問Clojure的STM的值歷史嗎?

原因是,我正在更新一個代理負載,我需要保持值的歷史記錄。如果STM已經保留了它們,我寧願使用它們。我無法在API中找到看起來像從STM歷史中讀取值的函數,所以我猜不到,我也不能在Java源代碼中找到任何方法,但也許我看起來不正確。

+0

你的留言不正確。沒有歷史可以閱讀,因爲沒有歷史。當事務提交時,舊值不再被引用並且有資格進行垃圾回收。 – Gabe

+0

哦,我現在看到,歷史只在交易期間舉行。感謝你的回答。 – Hendekagon

回答

9

您無法直接訪問值的stm歷史記錄。但是你可以利用add-watch記錄值的歷史:

(def a-history (ref [])) 
(def a (agent 0)) 
(add-watch a :my-history 
    (fn [key ref old new] (alter a-history conj old))) 

每次a更新(STM的事務提交)舊值將conjed到了在a-history舉行的序列。

如果你想獲得訪問所有中間值,即使回滾事務,你可以在交易過程中發送的值,以代理:

(def r-history (agent []) 
(def r (ref 0)) 
(dosync (alter r 
      (fn [new-val] 
      (send r-history conj new-val) ;; record potential new value 
      (inc r))))     ;; update ref as you like 

交易完成後,所有更改代理r-history將被執行。

+1

+1。還值得注意的是,在很多情況下(由於持久的數據結構),保留過去的值將比使用整個副本佔用更少的空間。所以這實際上可能是一種非常節省空間的存儲歷史的方式。 – mikera

+0

感謝您的額外想法。最後我使用了clojure.lang.PersistentQueue – Hendekagon