如何使 WARP 服务器终止?
How do I cause a WARP server to terminate?
我有一个 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 响应后结束进程?
我现在正在 phone,因此无法为您输入准确的代码。但基本思想是抛出你的 Warp 线程一个异步异常。这听起来可能很复杂,但最简单的方法是使用 async 库中的 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!"
我有一个 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 响应后结束进程?
我现在正在 phone,因此无法为您输入准确的代码。但基本思想是抛出你的 Warp 线程一个异步异常。这听起来可能很复杂,但最简单的方法是使用 async 库中的 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!"