Advertisement
Guest User

Untitled

a guest
Jun 5th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (defn perform-request! [url]
  2.   (let [output (chan)]
  3.     (http/get url {} (fn [{:keys [status]}]
  4.       (>! output status)))
  5.     output))
  6.  
  7. (defn start-requester! [{:keys [url name]} timeout-value aggr-ch]
  8.   (go
  9.     (alts!
  10.       (timeout timeout-value)
  11.         ([_] (>! aggr-ch {:url url :name name :status 408}))
  12.  
  13.       (perform-request! url)
  14.         ([status] (>! aggr-ch {:url url :name name :status status})))))
  15.  
  16.  
  17. (defn start-aggregator! [init-count aggr-ch result-ch]
  18.   (go-loop [count init-count
  19.             state []]
  20.     (if (> count 0)
  21.       (recur
  22.         (dec count)
  23.         (conj state (<! aggr-ch)))
  24.       (>! state result-ch))))
  25.  
  26. (defn check-availabilities [mappings global-timeout]
  27.   (let [input (map (fn [[k v]] {:name k :url v}) mappings)
  28.         size (count input)
  29.         aggr-ch (chan)
  30.         result-ch (chan)]
  31.  
  32.   (do-seq [item input] (start-requester! item 250 aggr-ch))
  33.   (start-aggregator! size aggr-ch result-ch)
  34.  
  35.   (alt!!
  36.     result-ch                ([result] result)
  37.     (timeout global-timeout) ([_] {:error :timeout}))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement