Я пытаюсь написать механизм повторных попыток для 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?