gpt4 book ai didi

haskell - 如何导致 WARP 服务器终止?

转载 作者:行者123 更新时间:2023-12-02 17:05:18 25 4
gpt4 key购买 nike

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

关于haskell - 如何导致 WARP 服务器终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45839972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com