我正在使用serversession-backend-acid-state和serversession-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
函数,但是我不知道如何使用它来关闭酸状态。最好的方法是什么?
答案 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)