如何 运行 在快速关机时清理
how to run cleanup on snap shutdown
我正在使用 serversession-backend-acid-state for sessions, along with serversession-frontend-snap。
如果我运行使用acid-state的内存版本,一切正常:
-- 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
我使用acid-state的磁盘版本可以成功使用:
acidDisk :: IO (AcidStorage SessionMap)
acidDisk = AcidStorage <$> openLocalState emptyState
我的问题出现在我关闭 snap 时;我不知道在哪里可以通过 (createCheckpointAndClose . acidState)
正确关闭酸状态。如果没有正确关机,我会在重新启动 snap 时出错。
我在 Main.hs 中看到 cleanup
函数,但我不明白如何使用它来关闭酸态。最好的方法是什么?
编辑:我发现了 onUnload
,但无法用它包装 simpleServerSessionManager。
编辑 #2:我已经确定了如何使用 onUnload
使其与 acidDisk 一起工作:
ad <- liftIO $ fmap opts . createState =<< acidDisk
s <- nestSnaplet "sess"sess $
SS.initServerSessionManager (return ad)
onUnload (createCheckpointAndClose $ acidState $ storage ad)
如何关闭服务器?如果是通过终止进程,您将需要捕获 ThreadKilled
and/or UserInterrupt
异常,如记录 here
(Snap 似乎没有 "in case of forceful shutdown" 挂钩,也不是它的义务)
否则,您必须将检查点指令添加为您拥有的任何关闭程序的一部分。
作为参考,我通过获取对 acid-state 的引用解决了它,然后使用 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)
我正在使用 serversession-backend-acid-state for sessions, along with serversession-frontend-snap。
如果我运行使用acid-state的内存版本,一切正常:
-- 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
我使用acid-state的磁盘版本可以成功使用:
acidDisk :: IO (AcidStorage SessionMap)
acidDisk = AcidStorage <$> openLocalState emptyState
我的问题出现在我关闭 snap 时;我不知道在哪里可以通过 (createCheckpointAndClose . acidState)
正确关闭酸状态。如果没有正确关机,我会在重新启动 snap 时出错。
我在 Main.hs 中看到 cleanup
函数,但我不明白如何使用它来关闭酸态。最好的方法是什么?
编辑:我发现了 onUnload
,但无法用它包装 simpleServerSessionManager。
编辑 #2:我已经确定了如何使用 onUnload
使其与 acidDisk 一起工作:
ad <- liftIO $ fmap opts . createState =<< acidDisk
s <- nestSnaplet "sess"sess $
SS.initServerSessionManager (return ad)
onUnload (createCheckpointAndClose $ acidState $ storage ad)
如何关闭服务器?如果是通过终止进程,您将需要捕获 ThreadKilled
and/or UserInterrupt
异常,如记录 here
(Snap 似乎没有 "in case of forceful shutdown" 挂钩,也不是它的义务)
否则,您必须将检查点指令添加为您拥有的任何关闭程序的一部分。
作为参考,我通过获取对 acid-state 的引用解决了它,然后使用 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)