mamcx
mamcx

Reputation: 16186

How restart an async Suave server if it crash?

I have a embebed server for a mobile device that could crash sometimes. I need to always have the server alive. Now the problem is that I don't see how restart the server when it is async:

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..

How clean all and restart the server?

Upvotes: 3

Views: 75

Answers (1)

Maslow
Maslow

Reputation: 18746

catch the exception, call the start method like so:

// 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()

Upvotes: 1

Related Questions