Hi James, Thanks! How would one create a thread that continuously monitors a mail queue and sends any mails in it? Or do you mean that I would create one thread per mail that I want to send? Wouldn't that create a problem if I'm about to send 10000 mails in one go?
And thanks for the heads up regarding indefinite blocking - I'll make sure to guard against that. Thanks, Brjánn On Thu, 25 Oct 2018 at 18:57, James Reeves <ja...@booleanknot.com> wrote: > Hi Brjánn, > > Executing queued jobs in a background thread is a common task, and as it > happens there's a set of Java classes to do just that. > > (let [e (java.util.concurrent.Executors/newSingleThreadExecutor)] > (.execute e #(prn "foo")) > (.execute e #(prn "bar")) > (Thread/sleep 1000) > (.execute e #(prn "baz"))) > > Don't worry about cleaning up a single thread. An inactive thread takes up > a minimal amount of VM memory and no CPU. You're going to use up more OS > resources deleting and recreating the thread. > > You do need to be careful that sending an email doesn't block > indefinitely, but usually I/O operations come with timeouts. Just ensure > you set a reasonable timeout and do something sensible when you can't send. > > On Thu, 25 Oct 2018 at 16:46, <brj...@gmail.com> wrote: > >> Hi, >> >> First, I would like to briefly present myself to the list. I'm a >> psychologist and researcher at the Karolinska Institutet in Stockholm, >> Sweden. I do research within the field of internet-based psychological >> treatment - which is a field that has grown a lot during the last 10-15 >> years. I have developed my own web platform to deliver these treatments to >> patients with different mental and medical conditions. I wrote the first >> version in PHP, and not being a professional programmer, the code base is a >> big mess after > 10 years of development. >> >> Two years ago, a friend introduced me to Clojure. I had never worked with >> a lisp before, but I quickly fell completely in love with it. So many of >> the issues of programming in PHP completely disappeared! Words cannot >> express my gratitude to Rich for inventing Clojure, the core team, all >> developers out there who write extremely useful libraries, and my friend >> for introducing Clojure to me. >> >> I decided to completely rewrite my web platform in Clojure. I've chosen >> to do a gradual move from PHP to Clojure, meaning that I replace PHP code >> with Clojure code component by component and continuously test in >> production. Like I said, I'm not a professional programmer, and this >> venture poses a lot of challenges. I try to read everything I find in books >> and on the web, but when it comes to more complex issues, such as threads >> and async programming, I feel that I end up almost guessing and with a lot >> of trial and error. I have no idea how cautious one should be when >> launching a new thread (while it completely occupy the server???) and am >> often surprised when my go blocks suddenly freeze. I feel that I am at the >> mercy of the Clojure community if I want to understand these (and many >> other!) issues. >> >> This leads me to the subject of this email. I've decided to migrate my >> mail queue from PHP to Clojure. In PHP, it's just a cron job that executes >> every five minutes to send all emails (and actually also SMS-messages, but >> not really relevant) that have been queued. >> >> I've written a basic mock Clojure implementation with the following goals >> - All messages should be sent async, i..e, the web user should not have >> to wait while the email is being sent. -> I'm sending them in a separate >> thread. >> - I have a fear that if I have a thread dedicated only to sending emails, >> I'm wasting server resources. -> I want the thread to die 5 seconds after >> the last email in the queue has been sent. >> >> My implementation basically consists of >> - An eternal go loop that receives a notification through a channel if >> new messages have been queued >> - The go loop checks if the mail sender thread is running. If not, it >> starts it. >> - The mail sender thread dies 5 secs after the last email was sent >> - The state of the thread (running / not running) is stored in an agent >> to avoid race conditions (i.e., starting multiple threads or not starting a >> thread because it is running when its status is checked but stops right >> after). >> >> My code is here >> https://gist.github.com/brjann/2aef16849b9bd445374cb6b31efece60 >> >> If any of you have had the time and energy to read this far (including >> the code), I would be very grateful for your input. >> - Is there a risk that my go block will hang? >> - Have I eliminated the risk for race conditions? >> - Do I really need to kill the thread or is there no risk for thread >> starvation on the server (I will probably >> - Could I use send instead of send-off? I guess that I am now using two >> threads, one for the sender and one each time I send a message using >> send-off. >> - Any newbie mistakes / coding style issues? >> - Could this be done in a better/simpler way??? >> >> (Btw, I would be very grateful for feedback on the form of my question if >> you have any. Are there better/other forums? Could I present the question >> or code in a another manner to help you understand better?) >> >> I am happy for any replies - on the list or backchannel. And I hope that >> you feel that I have not misused your inbox (I may repeat this behavior...). >> >> Thanks, >> Brjánn >> >> -- >> 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. >> > > > -- > James Reeves > booleanknot.com > > -- > 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.