[英]clojure/ring/jetty: I am using > lein ring server. How do I configure the jetty instance that gets instantiated?
當我直接調用碼頭處理程序時,我能夠像這樣傳遞一個配置器:
(def header-buffer-size 8388608)
(defn start [port]
(ring/run-jetty
(var app)
{:port port
:join? false
:host "127.0.0.1"
:configurator
(fn [jetty]
(doseq [connector (.getConnectors jetty)]
(.setHeaderBufferSize connector header-buffer-size)))}))
我必須這樣做是因為發布時一直出現FULL HEAD錯誤。 現在,我重構了直接使用> lein ring server的東西,該服務器從命令行調用。
> lein ring server
這使用了我的project.clj中指定的一些配置:
:ring {:handler caribou.api.core/app
:servlet-name "caribou-api"
:init caribou.api.core/init
:port 33443}
這很好用,但是現在我又遇到了FULL HEAD問題。 所以我嘗試在其中添加一個配置器:
:ring {:handler caribou.api.core/app
:servlet-name "caribou-api"
:init caribou.api.core/init
:configurator
(fn [jetty]
(doseq [connector (.getConnectors jetty)]
(.setHeaderBufferSize connector 8388608)))
:port 33443})
而此堆棧跟蹤失敗:
Exception in thread "main" java.lang.ClassCastException:
clojure.lang.PersistentList cannot be cast to clojure.lang.IFn
at ring.adapter.jetty$run_jetty.invoke(jetty.clj:66)
at ring.server.standalone$serve$fn__833.invoke(standalone.clj:78)
at ring.server.standalone$try_port.invoke(standalone.clj:12)
at ring.server.standalone$serve.doInvoke(standalone.clj:75)
at clojure.lang.RestFn.invoke(RestFn.java:423)
at ring.server.leiningen$serve.invoke(leiningen.clj:20)
我認為這與將函數直接放置在地圖中有關,因此我在項目之外(在caribou.api.core中)定義了它,並嘗試像在其他地方定義的其余函數一樣引用它:
;; in caribou/api/core.clj
(def header-buffer-size 8388608)
(defn full-head-avoidance
[jetty]
(doseq [connector (.getConnectors jetty)]
(.setHeaderBufferSize connector header-buffer-size)))
;; in project.clj
:ring {:handler caribou.api.core/app
:servlet-name "caribou-api"
:init caribou.api.core/init
:configurator caribou.api.core/full-head-avoidance
:port 33443})
這啟動了應用程序,但發布時仍然出現413:FULL HEAD錯誤。 有任何想法嗎? 謝謝!
默認情況下,不評估在defproject
表單中編寫的defproject
,但是在defproject
時可以在defproject
使用~
( defproject
):
(defproject foo "1.2.3"
...
:some-fn-key ~(fn [& args] ...))
在這種特殊情況下,您可以取消定義配置程序函數的fn
形式的引用(不帶引號的情況下,該表單將用作包含一堆符號的列表,而不是編譯為一個函數)。
另外,您可以在defproject
表單之外定義配置器,並在第二種方法中在defproject
引用其名稱,但是隨后您需要在defproject
該名稱-否則它將被視為符號。 注意 在后一種情況下,不會產生異常,因為符號實際上是可調用的,並且可以接受任意參數(但僅在使用映射或集合以外的其他東西調用時才返回nil
;使用映射或集合時,它們會在其參數中查找自己) 。
答案是不使用環形服務器,而直接使用ring / ring-jetty-adapter啟動碼頭。 這樣,我仍然可以傳遞配置器,而BTW已更改為:
(defn full-head-avoidance
[jetty]
(doseq [connector (.getConnectors jetty)]
(.setRequestHeaderSize connector header-buffer-size)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.