Tôi đã tạo một daemon sử dụng một dạng rất nguyên thủy ipc
(telnet và gửi một Chuỗi có các từ nhất định theo một thứ tự nhất định). Tôi đã thoát khỏi nó và bây giờ đang sử dụng JSON
để chuyển tin nhắn đến Yesod
máy chủ. Tuy nhiên, có một số điều tôi thực sự thích trong thiết kế của mình và tôi không chắc lựa chọn của mình bây giờ là gì.
Đây là những gì tôi đã 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 hàm 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.
nên bây giờ, những gì tôi có là Người xử lý, tất cả đều trô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 trình xử lý có thể phải xử lý một đối tượng JSON khác nhau.
Những gì tôi muốn làm là gửi một JSON
đối tượng đại diện cho thành công và một đối tượng JSON khác cung cấp thông tin về một số ngoại lệ.
Tôi muốn foo
hàm trợ giúp của có thể trả về một Either
, nhưng tôi không chắc bằng cách nào tôi có được điều đó, cộng với khả năng chấm dứt đánh giá danh sách các hành động của tôi , buildSeq
.
Đây là sự lựa chọn duy nhất tôi thấy
1) đảm bảo exceptionHandler
là trong Handler. Đưa JobMap
vào App
hồ sơ. Sử dụng getYesod
thay đổi giá trị thích hợp để JobMap
chỉ ra chi tiết về ngoại lệ, sau đó có thể được truy cập bằngfoo
Có cách nào tốt hơn?
Những 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
. Máy khách 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à máy khách giao tiếp 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ì hơn.