我创建了一个使用非常原始形式的守护程序ipc
(远程登录并发送具有按特定顺序包含某些单词的String)。我抢购了它,现在正在使用它将JSON
消息传递到Yesod
服务器。但是,对于我的设计,我确实有一些特别喜欢的东西,而且我不确定现在的选择。
这是我在做什么:
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 ()
buildSeq中的每个函数如下所示
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
是TMVar Map
跟踪有关当前作业的信息。
所以现在,我所拥有的是处理程序,它们看起来都像这样
foo :: Handler RepJson
foo
代表我的守护程序的命令,每个处理程序可能必须处理不同的JSON对象。
我想做的是发送一个JSON
代表成功的对象,以及另一个JSON对象,该对象表达有关某些异常的信息。
我希望foo
s的辅助函数能够返回Either
,但是我不确定如何获得该函数,以及能够终止对动作列表进行评估的功能buildSeq
。
这是我唯一的选择
1)确保exceptionHandler
在Handler中。将JobMap
在App
纪录。通过使用getYesod
alternate适当的值来JobMap
指示有关异常的详细信息,然后可以由foo
有没有更好的办法?
我还有其他选择吗?
编辑:为清楚起见,我将解释的作用Handler RepJson
。服务器需要某种方式来接受命令,例如build
stop
report
。客户端需要某种方式来了解这些命令的结果。我选择JSON作为服务器和客户端相互通信的媒介。我使用Handler类型只是为了管理JSON输入/输出,仅此而已。