Undertow(luminus/ring-undertow-adapter)的垫片:让它也能发 Ring SPEC 的流式正文
(ring.core.protocols/StreamableResponseBody)。
luminus 的 adapter 不认识 SPEC 的流式正文(直接 500「Body class not supported」),InputStream / seq 正文又是
攒满了才发(designs/server-module.md §1 的实测)。它的正文分派是一个开放协议
ring.adapter.undertow.response/RespondBody——install! 给它补上 StreamableResponseBody 接口的实现:
离开 IO 线程、startBlocking、把 exchange 的 OutputStream 交给 write-body-to-stream(每次 flush 即推送)、收尾。
(require '[ring.adapter.undertow :refer [run-undertow]]
'[im.ttalk.agent.server.adapter.undertow :as ut-shim])
(ut-shim/install!) ;; 进程里调一次(幂等)
(run-undertow handler {:port 3000})
只影响直接实现该接口的正文(reify / deftype);String、InputStream 等照旧走 adapter 自己的实现。
不引 Undertow 的硬依赖:requiring-resolve 取协议,用 Undertow 的人自己的 classpath 上有它。
Undertow(`luminus/ring-undertow-adapter`)的垫片:让它也能发 **Ring SPEC 的流式正文**
(`ring.core.protocols/StreamableResponseBody`)。
luminus 的 adapter 不认识 SPEC 的流式正文(直接 500「Body class not supported」),InputStream / seq 正文又是
攒满了才发(designs/server-module.md §1 的实测)。它的正文分派是一个**开放协议**
`ring.adapter.undertow.response/RespondBody`——`install!` 给它补上 `StreamableResponseBody` 接口的实现:
离开 IO 线程、`startBlocking`、把 exchange 的 OutputStream 交给 `write-body-to-stream`(每次 flush 即推送)、收尾。
```clojure
(require '[ring.adapter.undertow :refer [run-undertow]]
'[im.ttalk.agent.server.adapter.undertow :as ut-shim])
(ut-shim/install!) ;; 进程里调一次(幂等)
(run-undertow handler {:port 3000})
```
只影响**直接实现**该接口的正文(reify / deftype);String、InputStream 等照旧走 adapter 自己的实现。
不引 Undertow 的硬依赖:`requiring-resolve` 取协议,用 Undertow 的人自己的 classpath 上有它。(install!)给 luminus adapter 的 RespondBody 协议补上 SPEC 流式正文的实现。幂等;回 true。
给 luminus adapter 的 `RespondBody` 协议补上 SPEC 流式正文的实现。幂等;回 true。
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |