2012-04-23 5 views
9

, 정말 같은 피규에 통과 할 수 있었다 :클로저/링/부티 : 링링 서버를 사용하고 있습니다. 인스턴스화되는 부두 인스턴스를 어떻게 구성합니까? 내가 직접 부두 핸들러를 호출 할 때

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

내가 게시 할 때 전체 머리의 오류가 계속 때문에이 작업을 수행했다. 이제 커맨드 라인에서 호출되는 링 링 서버를 직접 사용하도록 리팩토링했습니다.

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

이 잘 작동하지만, 지금은 다시 FULL HEAD 문제를 점점 오전 :

> lein ring server 

내 project.clj에 지정된 일부 구성을 사용합니다. 그래서 나는 거기에 구성자을 추가하려고 :

: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을 머리 게시 할 때 오류가 발생했습니다. 어떤 아이디어? 감사!

답변

3

물건은 기본적으로 평가되지 않습니다,하지만 당신이 그것을 필요로 할 때 당신은 defproject에서 ~ (맺다)를 사용할 수 있습니다 로 :이 특정 상황에서

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

, 당신이 (가 아닌 함수로 컴파일 unquoting없이 문자의 무리를 포함하는 목록으로 사용되는) 당신의 구성자 함수를 정의하는 fn 양식을 맺다 것입니다.

또는, defproject 형태로 외부 구성자를 정의하고 두 번째 방법에서와 같이 defproject 내 이름을 참조하지만, 당신은 defproject 안에 이름을 맺다 할 수 있습니다 - 그렇지 않으면 상징으로 처리됩니다. NB. 후자의 경우에는 기호가 실제로 호출 가능하고 임의의 인수를 받아들이 기 때문에 예외가 생성되지 않습니다 (단지도 또는 집합 이외의 다른 것으로 호출하면 nil을 반환하며지도 또는 집합을 사용하면 인수에서 스스로를 찾습니다) .

+0

아마도 답변이 게시 된 이후에 변경된 내용 일 수 있습니다.하지만 여기에 제안 된 (함수 정의 인용 부호 제외) 경우 "태그 개체에 대한 리더 기능이 없습니다"라는 오류가 발생합니다. 이것이 일어날 수있는 이유가 있습니까? – Timur

3

대답은 링 서버를 사용하지 않고 링/링 제티 어댑터로 직접 부두를 시작하는 것입니다. 나는 여전히 BTW이 변경되었습니다 피규에 전달할 수 있습니다 그런 식으로하십시오 defproject 형태로 내부에 기록 된

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