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.

Reply via email to