Oh - this appears to be a separate issue that isn't just about leaving the context of the db transaction, I don't know enough about those parts of manifold to address the issue, sorry.
On Tue, Jul 11, 2017 at 1:18 PM <lawrence.krub...@gmail.com> wrote: > Justin, thanks. I'd like to ask a follow up question. To be clear, if I go > into (doseq) then this works fine: > > (defn start [] > (let [ > config (get-config) > mysql-db { > :dbtype "mysql" > :dbname (get-in config [:database :config :connection > :database]) > :user (get-in config [:database :config :connection > :user] ) > :password (get-in config [:database :config :connection > :password] ) > :host (get-in config [:database :config :connection > :host]) > } > data (fetch mysql-db) > ] > (slingshot/try+ > (doseq [row data] > (queue/enqueue row)) > (catch Object o > (errors/error o "" "error in query_database/start: "))))) > > > but if I do this instead: > > ;;;;;;; (doseq [row data] > (queue/enqueue data)) > > and then enqueue does this: > > (->> (ms/->source data) > (ms/onto executor) > (ms/map api/query)) > > > The first row comes through fine, but then the second row is never > processed. > > So are you suggesting that simply passing "data" from one function to the > next is enough to lose the database context? But only after the first row > has been pulled? > > > > > > > On Tuesday, July 11, 2017 at 1:44:15 PM UTC-4, Justin Smith wrote: > >> My first suspicion would be that by the time you access the second >> element, you have exited the context of your database transaction, so >> there's no data stream available to get it from. Lazyness doesn't tend to >> mix well with stateful resources and contexts. >> >> On Mon, Jul 10, 2017 at 9:45 PM <lawrence...@gmail.com> wrote: >> > Okay, that was a deadend. After going through line by line, I could pretty >>> well rule out any kind of Exception or Error. The first row from the >>> database seems to go through all of the functions perfectly, without any >>> errors. But the second row never gets called. >>> >>> Which takes me back to where I started. Why can't I give a lazy-seq to a >>> Manifold Stream and simply have a function map over the stream? >>> >>> >>> On Monday, July 10, 2017 at 11:25:43 PM UTC-4, lawrence...@gmail.com >>> wrote: >>>> >>>> >>>> Once again, my lack of knowledge of Java trips me up. Manifold relies >>>> on Dirigiste, which relies on Java's Executor Service. I see a bit here: >>>> >>>> >>>> http://www.nurkiewicz.com/2014/11/executorservice-10-tips-and-tricks.html >>>> >>>> Nurkiewicz writes: >>>> "I got bitten by that too many times: it won't print *anything*. No >>>> sign of java.lang.ArithmeticException: / by zero, nothing. Thread pool >>>> just swallows this exception, as if it never happened. If it was a good'ol >>>> java.lang.Thread created from scratch, UncaughtExceptionHandler >>>> <https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html> >>>> could >>>> work. " >>>> >>>> I suspect I'm facing something like that. >>>> >>>> >>>> >>>> On Monday, July 10, 2017 at 8:28:03 PM UTC-4, lawrence...@gmail.com >>>> wrote: >>>>> >>>>> By the way, this code works fine if I go into a (doseq) a level above >>>>> enqueue, and then put each individual row onto the stream. Then the code >>>>> loops over all of the rows. But that seems to defeat the whole point of >>>>> using something like Manifold. I want to be able to put the whole lazy-seq >>>>> on the stream. That is supposed to work, yes? >>>>> >>>>> >>>>> On Monday, July 10, 2017 at 8:18:07 PM UTC-4, lawrence...@gmail.com >>>>> wrote: >>>>>> >>>>>> I'm using Zach Tellman's excellent Manifold library, though I admit I >>>>>> don't fully understand it. >>>>>> >>>>>> My code queries a MySQL database and then needs to do some processing >>>>>> on each row retrieved. I copy-and-pasted some code from the documentation >>>>>> for Manifold: >>>>>> >>>>>> >>>>>> ;; 2017-07-10 -- we want a thread pool. I'm arbitrarily choosing 200 >>>>>> threads. >>>>>> ;; query_database/start will pull data from the database and dump it >>>>>> onto a >>>>>> ;; stream below, at which point each row should be assigned to one of >>>>>> the rows >>>>>> ;; on our thread pool. >>>>>> (def executor (me/fixed-thread-executor 200)) >>>>>> >>>>>> >>>>>> (defn enqueue >>>>>> [sequence-from-database] >>>>>> (slingshot/try+ >>>>>> (println "the type of the object from the database: " (type >>>>>> sequence-from-database)) >>>>>> (->> (ms/->source sequence-from-database) >>>>>> (ms/onto executor) >>>>>> (ms/map api/query)) >>>>>> (catch Object o >>>>>> (println " message queue is not happy about the message we were >>>>>> given") >>>>>> (errors/error o "" " we tried to put something on the message >>>>>> queue, but we got an error ")))) >>>>>> >>>>>> The line where I print out the type assures that I'm dealing with a >>>>>> LazySeq. >>>>>> >>>>>> The code prints out the type and the first row: >>>>>> >>>>>> >>>>>> the type of the object from the database: clojure.lang.LazySeq >>>>>> >>>>>> in query_api/query {:profile_id 2, :profile_name Mike Shaw >>>>>> Automotive Group, :headquarters_addr1 90 Madison St., :headquarters_city >>>>>> Denver, :headquarters_state_code CO, :headquarters_country_code US, :url >>>>>> mikeshawauto.com} >>>>>> >>>>>> and then it stops. I assume there must be an Exception or Error >>>>>> happening, but I can't find it. I've added as many general Catch clauses >>>>>> as >>>>>> I could: >>>>>> >>>>>> >>>>>> (defn query >>>>>> [row & args] >>>>>> >>>>>> (println " in query_api/query " row) >>>>>> >>>>>> (let [config (if args >>>>>> (first args)) >>>>>> ] >>>>>> ;; 2017-03-30 -- the API is overwhelmed and all I get is Socket >>>>>> Timeout errors >>>>>> (Thread/sleep 300) >>>>>> >>>>>> (slingshot/try+ >>>>>> (call-api row) >>>>>> (catch Object o >>>>>> (println " error : " o) >>>>>> >>>>>> ;;(errors/error o row " we tried to call-api, but we got this >>>>>> error ") >>>>>> >>>>>> >>>>>> ) >>>>>> >>>>>> (catch Error e >>>>>> (println " there Error: " e)) >>>>>> ))) >>>>>> >>>>>> So if I do: >>>>>> >>>>>> java -jar scan-database-find-similar-items-standalone.jar >>>>>> >>>>>> >>>>>> The code runs till it prints out the first row from the database, and >>>>>> then it stops. Nothing else happens. There are no error messages. >>>>>> >>>>>> What did I miss? >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> >> To post to this group, send email to clo...@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+u...@googlegroups.com >> >> >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> >> To unsubscribe from this group and stop receiving emails from it, send an >>> email to clojure+u...@googlegroups.com. >> >> >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > 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 > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.