如何 运行 在快速关机时清理

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)