2012-04-23 20 views
9

Khi tôi gọi handler cầu cảng trực tiếp, tôi đã có thể vượt qua trong một cấu hình như vậy:clojure/ring/jetty: Tôi đang sử dụng> máy chủ vòng lein. Làm thế nào để cấu hình thể hiện cầu nối được khởi tạo?

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

tôi phải làm điều này vì tôi giữ lấy một lỗi ĐẦU ĐẦY ĐỦ khi đăng. Bây giờ tôi đã tái cấu trúc mọi thứ để sử dụng> máy chủ vòng lein trực tiếp, được gọi từ dòng lệnh.

> lein ring server 

này sử dụng một số cấu hình quy định tại project.clj tôi:

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

này hoạt động tuyệt vời, nhưng bây giờ tôi nhận được vấn đề ĐẦU ĐẦY ĐỦ một lần nữa. Vì vậy, tôi cố gắng thêm một cấu hình trong đó:

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

Và điều này không thành công với stacktrace này:

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) 

I figured này đã phải làm với việc đưa chức năng trực tiếp trong bản đồ như thế, vì vậy tôi định nghĩa nó ngoài dự án (trong caribou.api.core) và cố gắng đề cập đến nó như tôi làm phần còn lại của các chức năng được xác định ở nơi khác:

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

này quay lên ứng dụng, nhưng tôi vẫn nhận được 413: đẦY ĐỦ CÁI ĐẦU lỗi khi đăng. Bất kỳ ý tưởng? Cảm ơn!

Trả lời

3

Stuff viết bên trong một hình thức defproject là không được đánh giá theo mặc định, nhưng bạn có thể sử dụng ~ (unquote) trong defproject khi bạn cần để:

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

trong trường hợp đặc biệt này, bạn muốn unquote dạng fn xác định chức năng của bạn cấu hình (mà không unquoting đang được sử dụng như một danh sách có chứa một loạt các biểu tượng, chứ không phải biên dịch vào một chức năng).

Ngoài ra, bạn có thể xác định cấu hình bên ngoài dưới hình thức defproject và tham khảo tên của nó bên trong defproject như trong cách tiếp cận thứ hai của bạn, nhưng sau đó bạn cần phải unquote tên bên defproject - nếu không nó sẽ được coi như một biểu tượng. NB. trong trường hợp thứ hai, không có ngoại lệ nào được tạo ra, bởi vì các ký hiệu trong thực tế có thể gọi và chấp nhận các đối số tùy ý (nhưng chỉ trả về nil khi được gọi với một cái gì đó khác với bản đồ hoặc tập hợp; với bản đồ hoặc bộ, chúng tự tìm kiếm trong đối số của chúng) .

+0

Đó có thể là điều đã thay đổi kể từ khi câu trả lời được đăng, nhưng khi tôi làm như đề xuất ở đây (unquote định nghĩa hàm) tôi nhận được một lỗi khác: "Không có chức năng đọc cho đối tượng thẻ". Bạn có một ý tưởng tại sao điều này có thể xảy ra? – Timur

3

Câu trả lời không phải là sử dụng máy chủ vòng và chỉ bắt đầu cầu nối trực tiếp với bộ chuyển đổi vòng/vòng-cầu nối. Bằng cách đó tôi vẫn có thể vượt qua trong các cấu hình, mà BTW đã thay đổi như thế này:

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