簡體   English   中英

clojure / ring / jetty:我正在使用> lein環形服務器。 如何配置實例化的碼頭實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM