我有一个HTTP应用程序服务器,在某些情况下(为了由主管重新启动),在处理某些请求时需要退出。
给定一个主要的像:
import Network.Wai.Handler.Warp (run)
main :: IO ()
main = do
config <- readConfig
run (portNumber config) (makeApp config)
和一个类似的处理程序:
livenessServer1 :: UTCTime -> FilePath -> Server LivenessProbeAPI1
livenessServer1 initialModificationTime monitorPath = do
mtime <- liftIO $ getModificationTime monitorPath
case mtime == initialModificationTime of
True -> return $ Liveness initialModificationTime mtime
False -> throwError $ err500 { errBody = "File modified." }
传递500响应后,如何使流程结束?
最佳答案
我现在正在使用手机,因此无法为您输入确切的代码。但基本思想是使Warp线程异步异常。这听起来很复杂,但是最简单的方法是使用异步库中的race函数。像这样的东西:
toExitVar <- newEmptyMVar
race warp (takeMVar toExitVar)
然后在处理程序中,当您希望Warp退出时:
putMVar toExitVar ()
编辑一天后,我回到计算机上,这是一个完整的示例:
#!/usr/bin/env stack
-- stack --resolver lts-9.0 script
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types
import Control.Concurrent.Async
import Control.Concurrent.MVar
main :: IO ()
main = do
toDie <- newEmptyMVar
race_ (takeMVar toDie) $ run 3000 $ \req send ->
if pathInfo req == ["die"]
then do
putMVar toDie ()
send $ responseLBS status200 [] "Goodbye!"
else send $ responseLBS status200 [] "Still alive!"