клиент. Go повторная попытка истекла - PullRequest
2 голосов
/ 31 января 2020

Я пытаюсь написать механизм повторных попыток для rp c. Go.

func getMessage(config Configuration) (b bool, s string) {
    var timer *time.Timer
    req := RequestGetMessage{Topic: config.Topic}
    reply := ResponseGetMessage{}
    client, _ := rpc.Dial("tcp", config.Addr)
    try := 0
    for try < config.MaxRetry {
        call := client.Go("Server.GetMessage", req, &reply, nil)
        timer = time.NewTimer(time.Duration(config.RTimeout) * time.Millisecond)
        select {
        case <- call.Done:
            if call.Error == nil {
                if reply.Ok {
                    replyAck := ResponseAck{}
                    client.Call("Server.SendAck", RequestAck{Id: reply.Id}, &replyAck)
                    if replyAck.Ok {
                        client.Close()
                        return true, reply.Value
                    } else {
                        client.Close()
                        continue
                    }
                } else {
                    fmt.Printf("No message about this topic!\n")
                    client.Close()
                    return false, ""
                }
            } else {
                fmt.Printf("Error: %s\n", call.Error)
                client.Close()
                return false, ""
            }
        case <-timer.C:
            client.Close()
            try++
            client, _ = rpc.Dial("tcp", config.Addr)
            fmt.Printf("Timeout expired! Retry n: %d\n", try)
        }
    }
    fmt.Printf("Max Retry exceed\n")
    client.Close()
    return false, ""
}

Я тестирую тайм-аут, но после истечения первого тайм-аута клиент подключен, но он всегда получает тайм-аут истек чек! Я пытался заменить case <-timer.C: на case <-time.After(time.Duration(config.RTimeout) * time.Millisecond), но ничего не изменилось. Как правильно реализовать время ожидания для rp c. Go?

...