我制作了一个守护进程,它使用了一种非常原始的形式ipc
(telnet 并发送一个字符串,该字符串具有特定顺序的特定单词)。我摆脱了它,现在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
在处理程序中。放入记录JobMap
。App
使用getYesod
更改适当的值来JobMap
指示有关异常的详细信息,然后可以通过foo
有没有更好的办法?
我的其他选择是什么?
编辑:为清楚起见,我将解释Handler RepJson
. 服务器需要某种方式来接受命令,例如build
stop
report
. 客户端需要某种方式来了解这些命令的结果。我选择 JSON 作为服务器和客户端相互通信的媒介。我使用 Handler 类型只是为了管理 JSON 输入/输出,仅此而已。