Я использую 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)
.Без надлежащего выключения я получу ошибку при перезапуске оснастки.
Я вижу функцию cleanup
в Main.hs, но я не понимаю, как я могу использовать это, чтобы закрыть кислотное состояние.Каков наилучший подход для этого?
Редактировать: я обнаружил onUnload
, но не могу обернуть его в simpleServerSessionManager.
Редактировать # 2: Я определил, какиспользуйте onUnload
, чтобы заставить его работать с acidDisk:
ad <- liftIO $ fmap opts . createState =<< acidDisk
s <- nestSnaplet "sess"sess $
SS.initServerSessionManager (return ad)
onUnload (createCheckpointAndClose $ acidState $ storage ad)