如果崩溃,如何重新启动异步Suave服务器?

问题描述 投票:3回答:1

我有一个移动设备的嵌入式服务器,有时会崩溃。我需要始终让服务器活着。现在问题是我没有看到在异步时如何重启服务器:

let startServer(rootPath) =
    let cf = serverConfig rootPath
    printfn "%A" cf
    startWebServerAsync cf app
    |> snd
    |> Async.StartAsTask 

type App() =
    inherit Application()

    let mutable task:System.Threading.Tasks.Task = null

    do
        let t = startServer(...)
        task <- t //The task is hold here to avoid it being GC..

如何清理所有并重新启动服务器?

f# crash restart suave
1个回答
1
投票

捕获异常,调用start方法如下:

// server sample stub
let startServer(_rootPath):Async<_>=
    async {
        printfn "server started"
        do! Async.Sleep 500
        return "blah"
    }
// stubs for example code to compile
type Application() = class end
type App() =
    inherit Application()

    let mutable task:System.Threading.Tasks.Task= null
    let rec startRestartable() = 
        // catch the async to avoid GC
        task <- 
                async{
                    let! serverResult = startServer(".") |> Async.Catch
                    match serverResult with
                    | Choice1Of2 x ->
                        // no exception? whatever you would do if the server terminates normally
                        // I'll assume you want a restart
                        // all paths lead to restart, do nothing here
                        printfn "Server finished? why? %A" x
                        ()
                    | Choice2Of2 ex ->
                        // log exception, poor logging example stub
                        eprintfn "server crash: %A" ex
                    startRestartable()
                }
                |> Async.StartAsTask 




    do
        printfn "Starting"
        startRestartable()
© www.soinside.com 2019 - 2024. All rights reserved.