Skip to content

Instantly share code, notes, and snippets.

@amoe
Last active June 1, 2017 14:16
Show Gist options
  • Save amoe/7fdc89163069abc53c46192d805398e3 to your computer and use it in GitHub Desktop.
Save amoe/7fdc89163069abc53c46192d805398e3 to your computer and use it in GitHub Desktop.
minimum wait queue
(ns wn-backend.concdemo
(:require [wn-backend.util.common :refer :all]
[clj-http.client :as client])
(:import [java.util.concurrent LinkedBlockingQueue]))
(def my-queue (LinkedBlockingQueue.))
(def queue-minimum-delay 1000)
(defn queue-processor []
(loop []
(debugp "waiting on queue" true)
(let [item (.take my-queue)]
(debugp "took item from queue" item)
(deliver (:promise item)
(client/get (:url item))))
(Thread/sleep queue-minimum-delay)
(when-not (Thread/interrupted)
(recur))))
(defn wait-for-request [url]
(let [delivery-promise (promise)]
;; This will never error or block.
(.add my-queue
{:url url
:promise delivery-promise})
(-> delivery-promise deref)))
(defn foo []
(wait-for-request "http://www.example.com/"))
(def processor-handle (atom nil))
(defn start-queue! []
(reset! processor-handle (future (queue-processor))))
(defn stop-queue! []
;; XXX return value?
(future-cancel @processor-handle))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment