【问题标题】:clojure/ring/jetty: I am using > lein ring server. How do I configure the jetty instance that gets instantiated?clojure/ring/jetty:我正在使用 > lein ring 服务器。如何配置实例化的码头实例?
【发布时间】:2012-05-04 14:24:15
【问题描述】:

当我直接调用码头处理程序时,我能够像这样传递一个配置器:

(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 错误。有任何想法吗?谢谢!

【问题讨论】:

    标签: clojure jetty leiningen ring


    【解决方案1】:

    默认情况下不会评估 defproject 表单中写入的内容,但您可以在需要时在 defproject 中使用 ~(取消引用):

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

    在这种特殊情况下,您可以取消引用定义配置器函数的 fn 表单(没有取消引用,它被用作包含一堆符号的列表,而不是编译成函数)。

    或者,您可以在 defproject 表单之外定义配置器并在 defproject 中引用其名称,就像在您的第二种方法中一样,但是您需要取消引用 defproject 内的名称 - 否则它将是被视为一个符号。注意。在后一种情况下不会产生异常,因为符号实际上是可调用的并且可以接受任意参数(但只有在使用映射或集合以外的东西调用时才会返回 nil;对于映射或集合,它们会在它们的论据)。

    【讨论】:

    • 这可能是自发布答案以来发生的变化,但是当我喜欢这里提出的建议时(取消引用函数定义)我得到另一个错误:“没有标签对象的读取器函数”。您知道为什么会发生这种情况吗?
    【解决方案2】:

    答案是不使用 ring server,直接用 ring/ring-jetty-adapter 启动 jetty。这样我仍然可以传入配置器,顺便说一句,它已更改为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2013-09-29
      • 2019-01-21
      • 1970-01-01
      • 2013-07-16
      • 2014-04-17
      • 2016-04-13
      相关资源
      最近更新 更多