Можно ли получить доступ к истории ценностей Clojure STM? - PullRequest
7 голосов
/ 27 июня 2011

Учитывая, что STM хранит историю, скажем, 10 значений ссылок, агентов и т. Д., Можно ли прочитать эти значения?

Причина в том, что я обновляю загрузку агентов, и мне нужно вести историю значений. Если STM уже хранит их, я бы лучше использовал их. Я не могу найти в API функции, которые выглядят так, как будто они читают значения из истории STM, поэтому я не думаю, что я не могу найти какие-либо методы в исходном коде Java, но, возможно, я не выглядел правильно.

1 Ответ

9 голосов
/ 27 июня 2011

Вы не можете получить доступ к истории значений 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 фиксируется), старое значение будет добавлено в последовательность, которая содержится в 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 будут выполнены.

...