2013-04-19 15 views
11

Tôi vừa bắt đầu phát triển một dịch vụ ở Clojure. Tôi bị mất một chút trong cách tiếp cận máy chủ tắt máy.Cách thực hành tốt nhất để nhúng NREPL trong Clojure Server

Tôi đang sử dụng Clojure 1.5.1. Để đăng nhập, tôi đang sử dụng Timbre 1.5.3. Tôi muốn nhúng NREPL vào máy chủ của tôi để triển khai mã nóng.

Đây là tệp core.clj của tôi. Core là chính của tôi và tôi đang sử dụng vỏ ứng dụng mà "ứng dụng mới lein" tạo ra.

(ns extenium.core 
    (:require [taoensso.timbre :as t] 
      [clojure.tools.nrepl.server :as nrs]) 
    (:gen-class)) 

(def nrepl-server) 

(defn start-nrepl-server [] 
    (t/info "Starting nrepl server on port 8628") 
    (alter-var-root #'nrepl-server 
        (constantly 
        (nrs/start-server :port 8628))) 
    (t/info "Started nrepl server")) 

(defn stop-nrepl-server [] 
    (t/info "Stopping nrepl server") 
    (nrs/stop-server nrepl-server) 
    (t/info "Stopped nrepl server")) 

(defn start [] 
    (alter-var-root #'*read-eval* 
        (constantly 
        false)) 
    (start-nrepl-server)) 

(defn stop [] 
    (stop-nrepl-server)) 

(defn -main [& args] 
    (start)) 

Khi tôi "lein run" máy chủ nrepl bắt đầu như mong đợi, với thông báo thông báo sẽ đến Terminal. Sau đó tôi kết nối với "nrepl" từ Emacs. Không vấn đề gì. Từ Emacs tôi thực hiện "(extenium.core/stop)". Tại thời điểm đó, tôi nhận được thông báo "Dừng máy chủ nrepl" trên Emacs (có nghĩa là stdout đã được chuyển hướng đến máy khách). Kết nối đóng (như mong đợi) và tôi không bao giờ thấy thông báo "Ngừng máy chủ nrepl". Khỏe.

Tôi nhìn vào Thiết bị đầu cuối và tôi không thấy thông báo "Dừng ..." hoặc "Ngừng ...". Thay vào đó, tôi nhận được ngoại lệ sau đây:

Exception in thread "nREPL-worker-0" java.lang.Error: java.net.SocketException: Socket closed 

Lý tưởng nhất, tôi muốn những điều sau:

  1. Để có thể tiến hành tắt máy từ một khách hàng NREPL. Đóng tất cả các kết nối máy khách NREPL một cách duyên dáng mà không có ngoại lệ. Tắt máy với các thông điệp ghi nhật ký hướng tới Terminal (hoặc cuối cùng là một tệp nhật ký xoay).
  2. Trong thời gian kết nối NREPL, sao chép đầu ra ghi nhật ký cho cả máy chủ (Thiết bị đầu cuối hoặc nhật ký) và đầu ra NREPL.
  3. Chụp thông tin về các kết nối NREPL đến, đặt tên cho chúng, và nhật ký kết nối và ngắt kết nối hoạt động.
  4. Cuối cùng, xác thực các kết nối NREPL đến.
  5. Thậm chí sau đó, cho phép họ thực hiện các tác vụ họ thực hiện.

Trả lời

2

Tuyên bố từ chối trách nhiệm: Tôi chưa làm điều này, nhưng có vẻ thú vị.

Mỗi số README, cụ thể là phần "Tại sao lại là nREPL?" bạn sẽ có thể triển khai thực hiện 2 - 4 bằng cách thực hiện vận chuyển tùy chỉnh của riêng bạn, có lẽ chỉ đơn thuần là mở rộng một trong những cái ngoài hộp.

Dừng máy chủ một cách duyên dáng có thể kéo dài việc vận chuyển ổ cắm. Những gì bạn mô tả là "tắt máy duyên dáng" giống như việc thực hiện giao thức "Đăng xuất".

Tác vụ cho phép họ thực hiện có vẻ đơn giản hơn. Có vẻ như bạn sẽ cần phải triển khai Trình xử lý tùy chỉnh, có thể một lần nữa gói default-handler bằng mã ủy quyền.

Chúc may mắn!

Các vấn đề liên quan