Clojure的/戒指/码头:我用>雷音环服务器。 如何配置被实例化的码头实例?(cloj

2019-07-29 03:25发布

当我直接调用码头处理程序中,我能够像这样一个配置经过:

(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)))}))

我不得不这样做,因为我一直在发帖时得到一个满脑子错误。 现在我重构的东西用>雷音环服务器直接,它会从从命令行调用。

> lein ring server

这将使用在我project.clj指定的一些配置:

:ring {:handler caribou.api.core/app
       :servlet-name "caribou-api"
       :init caribou.api.core/init
       :port 33443}

这个伟大的工程,但现在我又得到满脑子的问题。 于是,我就在里面添加一个配置:

: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:发帖时满脑子错误。 有任何想法吗? 谢谢!

Answer 1:

一个里面写的东西defproject形式默认情况下不进行评估,但可以使用~在(引文结束) defproject当你需要它:

(defproject foo "1.2.3"
  ...
  :some-fn-key ~(fn [& args] ...))

在这种特殊情况下,你会解除引用的fn形式定义你的配置功能(其不unquoting被用作包含了一堆符号列表,而不是编译成一个函数)。

或者,你可以定义外部配置defproject形式是指它的名字里面defproject作为你的第二个办法,但你需要解除引用里面的名字defproject -否则它会作为一个符号来处理。 NB。 在后一种情况下不会产生异常,因为符号其实都是调用,并接受任意参数(但只有再回到nil的时候比地图或一组其他一些所谓的;与地图或组,他们看自己在他们的论点) 。



Answer 2:

答案是不使用环服务器而直接与环/环码头适配器启动码头。 这样,我还可以通过在网络配置,这BTW变为这样:

(defn full-head-avoidance
  [jetty]
  (doseq [connector (.getConnectors jetty)]
    (.setRequestHeaderSize connector header-buffer-size)))


文章来源: clojure/ring/jetty: I am using > lein ring server. How do I configure the jetty instance that gets instantiated?