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ư build
stop
report
. 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.
Cảm ơn thông tin chi tiết của bạn, Tyler Durden. –