2012-04-12 39 views
93

Tôi đã tạo một daemon sử dụng hình thức nguyên thủy là ipc (telnet và gửi một chuỗi có các từ nhất định theo thứ tự nhất định). Tôi đã thoát khỏi nó và hiện đang sử dụng JSON để chuyển các tin nhắn đến máy chủ Yesod. Tuy nhiên, có một số điều tôi thực sự thích về thiết kế của tôi, và tôi không chắc chắn những lựa chọn của tôi bây giờ là gì.Trường hợp ngoại lệ trong Yesod

Đây là những gì tôi đang làm:

buildManager :: Phase -> IO() 
buildManager phase = do 
    let buildSeq = findSeq phase 
     jid = JobID $ pack "8" 
     config = MkConfig $ Just jid 
    flip C.catch exceptionHandler $ 
    runReaderT (sequence_ $ buildSeq <*> stages) config 
    -- ^^ I would really like to keep the above line of code, or something like it. 
    return() 

mỗi chức năng trong buildSeq trông như thế này

foo :: Stage -> ReaderT Config IO() 

data Config = MkConfig (Either JobID Product) BaseDir JobMap 

JobMap là một TMVar Map theo dõi thông tin về công việc hiện tại.

vì vậy bây giờ, những gì tôi có là Handlers, rằng tất cả giống như thế này

foo :: Handler RepJson 

foo đại diện cho một lệnh cho daemon của tôi, mỗi bộ xử lý có thể phải xử lý một đối tượng JSON khác nhau.

Điều tôi muốn làm là gửi một đối tượng JSON đại diện cho thành công và một đối tượng JSON khác thực hiện thông tin về một số ngoại lệ.

Tôi muốn foo s trợ giúp chức năng để có thể trả lại Either, nhưng tôi không chắc chắn làm thế nào tôi nhận được điều đó, cộng với khả năng chấm dứt đánh giá danh sách hành động của tôi, buildSeq.

Đây là lựa chọn duy nhất tôi thấy

1) đảm bảo exceptionHandler là trong Handler. Đặt JobMap vào bản ghi App. Sử dụng getYesod thay đổi giá trị thích hợp trong JobMap chỉ ra chi tiết về ngoại lệ, mà sau đó có thể được truy cập bởi foo

Có cách nào tốt hơn?

Các lựa chọn khác của tôi là gì?

Chỉnh sửa: Để rõ ràng, tôi sẽ giải thích vai trò của Handler RepJson. Máy chủ cần một số cách để chấp nhận các lệnh như buildstopreport. Khách hàng cần một số cách để biết kết quả của các lệnh này. Tôi đã chọn JSON làm phương tiện mà máy chủ và khách hàng liên lạc với nhau. Tôi đang sử dụng loại trình xử lý chỉ để quản lý JSON vào/ra và không có gì khác.

Trả lời

9

Về mặt triết học, trong thế giới Haskell/Yesod bạn muốn chuyển các giá trị về phía trước, thay vì trả về ngược lại. Vì vậy, thay vì có các trình xử lý trả về một giá trị, yêu cầu chúng chuyển tiếp tới bước tiếp theo trong tiến trình, có thể tạo ra một ngoại lệ.

Hãy nhớ rằng bạn có thể gộp bất kỳ số lượng hành động nào trong tương lai vào một đối tượng duy nhất, để bạn có thể truyền đối tượng tiếp tục đến trình xử lý và dữ liệu của bạn về cơ bản, "Sau khi hoàn tất, hãy chạy mã blob này". Bằng cách đó chúng có thể bị vô hiệu và không trả lại gì cả.

+0

Cảm ơn thông tin chi tiết của bạn, Tyler Durden. –

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