Skip to content

Commit 304e067

Browse files
[wwws] Supply custom executor to HTTP server which preserves Clojure classloader
1 parent e24002b commit 304e067

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/clj_async_profiler/wwws.clj

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
[clojure.string :as str])
1616
(:import (com.sun.net.httpserver HttpExchange HttpHandler HttpServer)
1717
java.io.File
18+
(java.util.concurrent Executors ThreadFactory)
1819
(java.net HttpURLConnection InetSocketAddress URL)))
1920

2021
(defn get-extension [^String filename]
@@ -82,7 +83,17 @@
8283
(.createContext "/" (proxy [HttpHandler] []
8384
(handle [^HttpExchange exchange]
8485
(root-handler exchange handler))))
85-
(.setExecutor nil)
86+
;; Specify executor that will produce a custom thread for the HTTP server:
87+
;; - thread should be daemon to prevent server from stalling the shutdown
88+
;; - thread should interit Clojure's classloader so that it sees resources
89+
;; that were loaded in dynamically
90+
(.setExecutor (Executors/newSingleThreadExecutor
91+
(let [cl (clojure.lang.RT/baseLoader)]
92+
(reify ThreadFactory
93+
(newThread [_ r]
94+
(doto (Thread. r)
95+
(.setContextClassLoader cl)
96+
(.setDaemon true)))))))
8697
(.start)))
8798

8899
(defn get-address [^HttpServer server]

0 commit comments

Comments
 (0)