2

我正在创建一个 Happstack 服务器应用程序,但我不知道如何结束应用程序。

如果我有:

main = do
  printf "begin server"
  simpleHTTP nullConf myHomepage
  printf "end server"

我可以运行它,我可以用 CTRL+C 杀死应用程序(linux),但最后一次打印永远不会执行。如何优雅地退出 Happstack?这让我很困扰,因为我注意到如果我没有从应用程序中正确退出,则不会生成事件日志。

更新:

该应用程序在顶部主要使用 Dyre。

4

2 回答 2

3

我通常用于在单独的线程forkIO中生成。simpleHTTP然后waitForTermination等待^C

module Main where

import Control.Concurrent (killThread, forkIO)
import Happstack.Server (nullConf, simpleHTTP, ok, toResponse)
import Happstack.State (waitForTermination)

main :: IO ()
main =
    do putStrLn "begin server"
       httpThreadId <- forkIO $ simpleHTTP nullConf (ok $ toResponse "This site rules!")
       waitForTermination
       killThread httpThreadId
       putStrLn "end server"

waitForTermination来自happstack-state包。由于多种原因,它确实需要移动到其他地方。如果您不想安装happstack-state,可以将本地副本复制并粘贴到您的应用中:

-- | Wait for a signal.
--   On unix, a signal is sigINT or sigTERM. 
waitForTermination :: IO ()
waitForTermination
    = do istty <- queryTerminal stdInput
         mv <- newEmptyMVar
         installHandler softwareTermination (CatchOnce (putMVar mv ())) Nothing
         case istty of
           True  -> do installHandler keyboardSignal (CatchOnce (putMVar mv ())) Nothing
                       return ()
           False -> return ()
         takeMVar mv
于 2011-09-06T00:10:58.833 回答
0

使用在单独的线程上运行simpleHTTP(这是一个 IO 操作)forkIO,然后在 main 方法上,您可以随时退出。

尝试类似:

main = do
    printf "begin server"
    threadID <- forkIO $ simpleHTTP nullConf myHomepage
    c <- getChar
    printf "Quiting"
于 2011-09-05T10:03:53.033 回答