> And even then, ensure is often not needed and overkill. Make sure you
> have a real business requirement that the predicate remain true (or
> value fixed) on transaction completion. We need to move to a world in
--------------
It seems that my problem falls exactly in this category. Ensuring  
*consuming* prohibits that the consumer misses messages added to  
*data* . At least I hope that it does.

(def *data* (ref ()))
(def *consuming* (ref false))
(def *is-syncing* (ref true))
(def *consumer-agent* (agent '()))

(defn data-producer [value]
        (if @*is-syncing*
                (if (dosync
                                (if (ensure *consuming*)
                                      true
                                        (do
                                                (alter *data* conj value)
                                                false)))
                                (do
                                        (loop []
                                                (Thread/sleep 100)
                                                (if @*is-syncing*
                                                        (recur)))))))           
                        
                        
(defn producer []
        (doseq [i (range 10000)]
                (data-producer i)))

(defn consume [agent]
        (Thread/sleep 150)
        (dosync
                (ref-set *consuming* true))
        (println "Consuming started, " (count @*data*) " items to consume.")
        (Thread/sleep 250)
        (dosync
                (ref-set *consuming* false)
                (ref-set *is-syncing* false)))

(defn consumer []
        (send-off *consumer-agent* consume))

(doseq [i (range 300)]
        (future-call producer))

(consumer)

(shutdown-agents)


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to