2012-04-23 20 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} 

यह अच्छा काम करता है, लेकिन अब मैं पूर्ण प्रमुख मुद्दा फिर से हो रही है:

> 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 मिलती है: पूर्ण सिर पोस्ट करते समय त्रुटि। कोई विचार? धन्यवाद!

उत्तर

3

सामग्री एक defproject प्रपत्र के भीतर लिखे गए डिफ़ॉल्ट रूप से मूल्यांकन नहीं किया है, लेकिन आप ~ (गंदें शब्द बोलना) defproject में उपयोग कर सकते हैं जब आपको उसकी आवश्यकता करने के लिए:

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

इस विशेष स्थिति में, आप fn प्रपत्र अपने विन्यासक समारोह (जो unquoting बिना प्रतीकों में से एक गुच्छा युक्त एक सूची के रूप में इस्तेमाल किया जा रहा है, बजाय एक समारोह में संकलित) को परिभाषित करने गंदें शब्द बोलना चाहते हैं।

वैकल्पिक रूप से, आप defproject प्रपत्र बाहर विन्यासक परिभाषित कर सकते हैं और अपने द्वितीय कार्य में के रूप में defproject अंदर जैसा कि इसके नाम का उल्लेख है, लेकिन फिर आप defproject अंदर नाम गंदें शब्द बोलना करने की जरूरत है - अन्यथा यह एक प्रतीक के रूप में माना जाएगा। एनबी। बाद के मामले में कोई अपवाद नहीं बनाया जाता है, क्योंकि प्रतीक वास्तव में कॉल करने योग्य होते हैं और मनमाने ढंग से तर्क स्वीकार करते हैं (लेकिन मानचित्र या सेट के अलावा किसी अन्य चीज़ के साथ बुलाए जाने पर केवल nil लौटाते हैं; नक्शे या सेट के साथ, वे अपने तर्कों में स्वयं को देखते हैं) ।

+0

शायद कुछ ऐसा है जो उत्तर पोस्ट होने के बाद बदल गया है, लेकिन जब मुझे यहां प्रस्तावित करना पसंद है (फ़ंक्शन परिभाषा को अनवरोधित करें) मुझे एक और त्रुटि मिलती है: "टैग ऑब्जेक्ट के लिए कोई पाठक फ़ंक्शन नहीं"। क्या आपको पता है कि ऐसा क्यों हो सकता है? – Timur

3

उत्तर रिंग सर्वर का उपयोग नहीं करना है और केवल अंगूठी/अंगूठी-जेटी-एडाप्टर के साथ जेटी शुरू करें। इस तरह मैं अभी भी विन्यासक, जो BTW यह करने के लिए बदल गया है में पारित कर सकते हैं:

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