как запустить очистку при мгновенном выключении - PullRequest
2 голосов
/ 31 мая 2019

Я использую 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)

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Для справки, я решил это, получив ссылку на кислотное состояние, а затем используя 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)

0 голосов
/ 04 июня 2019

Как вы выключаете сервер?Если это происходит, завершив процесс, вам нужно будет перехватить исключения ThreadKilled и / или UserInterrupt, как указано в документации здесь

(Snap не имеет "in"«случай принудительного отключения», и это не является его обязательством)

В противном случае вам придется добавить инструкцию контрольной точки как часть любой процедуры отключения, которую вы выполняете.

...