Я создал демона, который использовал очень примитивную форму ipc
(telnet и отправил 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
могла возвращать Either
, но я не уверен, как это получить, плюс возможность прекратить оценку моего списка действий, buildSeq
.
Здесь единственный выбор, который я вижу
1) убедитесь, что exceptionHandler
находится в обработчике. Поместите JobMap
в запись App
. Используя getYesod
измените соответствующее значение в JobMap
, указав сведения об исключении,
к которому затем можно получить доступ foo
Есть ли лучший способ?
Каковы мои другие варианты?
Изменить: для ясности я объясню роль Handler RepJson
. Серверу необходимо каким-то образом принять команды, такие как build
stop
report
. Клиенту нужен какой-то способ узнать результаты этих команд. Я выбрал JSON как среду, с которой сервер и клиент общаются друг с другом. Я использую тип Handler только для управления JSON in/out и ничего более.