如何在快照关闭时运行清理

时间:2019-05-31 16:04:09

标签: haskell haskell-snap-framework

我正在使用serversession-backend-acid-stateserversession-frontend-snap进行会话。

如果我使用的是酸性状态的内存版本,则一切正常:

-- create state container in memory from initial state
acidMem :: IO (AcidStorage SessionMap)
acidMem = AcidStorage <$> openMemoryState emptyState

app :: SnapletInit App App
app = makeSnaplet "app" "An snaplet example application." Nothing $ do
  conf <- getSnapletUserConfig
  h <- nestSnaplet "" heist $ heistInit "templates"
  s <- nestSnaplet "sess"sess $ SS.simpleServerSessionManager acidDisk id

通过使用以下命令,我可以成功使用酸性状态的磁盘版本:

acidDisk :: IO (AcidStorage SessionMap)
acidDisk = AcidStorage <$> openLocalState emptyState

我关闭快照时出现了问题;我不知道在哪里可以通过(createCheckpointAndClose . acidState)适当地关闭酸状态。没有适当的关闭,重新启动快照时会出现错误。

我在Main.hs中看到了cleanup函数,但是我不知道如何使用它来关闭酸状态。最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

如何关闭服务器?如果是通过终止进程,则需要捕获here

中记录的ThreadKilled和/或UserInterrupt异常

(Snap似乎没有“在强制关闭的情况下”挂钩,这也不是它的义务)

否则,您必须在所有关闭程序中添加检查点指令。

答案 1 :(得分:0)

作为参考,我通过获取对酸性状态的引用来解决它,然后使用onUnload将其关闭:

acidDisk :: IO (AcidStorage SessionMap)
acidDisk = AcidStorage <$> openLocalState emptyState

app :: SnapletInit App App
app = makeSnaplet "app" "An snaplet example application." Nothing $ do
  conf <- getSnapletUserConfig
  h <- nestSnaplet "" heist $ heistInit "templates"

  ad <- liftIO $ fmap opts . createState =<< acidDisk
  s <- nestSnaplet "sess"sess $ 
        SS.initServerSessionManager (return ad)
  onUnload (createCheckpointAndClose $ acidState $ storage ad)