Как выйти из приложения Hackstack Server? - PullRequest
2 голосов
/ 05 сентября 2011

Я создаю серверное приложение Happstack, но я не знаю, как завершить приложение.

Если у меня есть:

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

Я могу запустить его нормально, иЯ могу убить приложение (linux) с помощью CTRL + C, но последняя печать никогда не выполняется.Как я могу грациозно выйти из Happstack?Меня это беспокоит, потому что я замечаю, что журнал событий не генерируется, если я не правильно завершаю работу из приложения.

ОБНОВЛЕНИЕ:

Приложение использует Dyre вверхуглавный.

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Я обычно использую 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
0 голосов
/ 05 сентября 2011

Запустите simpleHTTP (который является операцией ввода-вывода) в отдельном потоке, используя forkIO, затем в основном методе вы можете выйти в любое время.

Попробуйте что-то вроде:

main = do
    printf "begin server"
    threadID <- forkIO $ simpleHTTP nullConf myHomepage
    c <- getChar
    printf "Quiting"
...