2015-09-22 5 views
3

Я создаю агента для записи изменений обратно в базу данных (как описано в журнале с записью на основе агента в Clojure Programming).Определение агента lazily

Это прекрасно работает, но я изо всех сил пытаюсь создать агента поздно. Я не хочу создавать его как def, так как я не хочу, чтобы он создавался при выполнении моих тестов (я вижу, что пул запускается, когда тесты загружают формы, хотя я использую с redefs для установки тестового значения).

кода я начал есть (с использованием C3P0 пулов):

(def dba (agent (pool/make-datasource-spec (u/load-config "db.edn")))) 

Я попытался сделать с агентом ноль, и исследовал, как я мог установить его в основном из моего приложения, когда это действительно необходимо. Но, похоже, нет эквивалентной функции reset!, так как есть с атомом. А следующий код также не говорил агент не был ошибкой, так не нуждается в перезагрузке:

(when (not @dba) 
    (restart-agent dba (create-db-pool))) 

Так что в данный момент у меня есть атом, содержащий агент, где я тогда делать:

(def dba (atom nil)) 
;; ... 
(defn init-db! [] 
    (when (not @dba) 
    (log/info "Creating agent for pooled connection") 
    (reset! dba (agent (create-db-pool)))) 

Но сам факт, который я должен сделать @@dba, чтобы ссылаться на содержимое агента (т. Е. Пул), заставляет меня думать, что это безумие.

Есть ли более очевидный способ создания пула агента лениво?

ответ

3

delay полезен для таких случаев. Это вызывает создание элемента при первом чтении. поэтому, если ваши тесты не будут прочитаны, он не будет создан.

user=> (def my-agent (delay (do (println "im making the agent now") (agent 0)))) 
#'user/my-agent 
user=> 
user=> @my-agent 
im making the agent now 
#object[clojure.lang.Agent 0x2cd73ca1 {:status :ready, :val 0}] 
+0

Это интересно, но все же требуется двойное разыменование для доступа к элементу, например. '(def a (delay (агент 0))), а затем' @a => # <Агент @ 14c657f9: 0> 'и' @@ a => 0'. Это нормально? Я не думаю, что когда-либо видел, что @ @ 'используется в чей-то код, который я просматривал, поэтому мне кажется, что я упускаю трюк. Однако это уменьшает мой код от необходимости явной проверки/сброса !, поэтому лучше в этом отношении. –

Смежные вопросы