我有一个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!"

10-06 01:00