我正在尝试创建一个功能,该功能将按以下方式工作:
调用服务函数后,它使用 Fetch 函数从服务(以字节数组的形式出现)获取记录,JSON 取消元帅字节数组,填充结构,然后将结构发送到数据库函数以保存到数据库。
现在,由于这需要是一个连续的作业,因此我添加了两个 if 条件,如果收到的记录长度为 0,则我们使用重试函数重试拉取记录,否则我们只需写入数据库。
我一直在尝试调试重试函数一段时间,但它只是不起作用,并且在第一次重试后基本上停止了(即使我将尝试指定为100)。我能做些什么来确保,它不断重试拉动记录?
代码如下:
// RETRY FUNCTION
func retry(attempts int, sleep time.Duration, f func() error) (err error) {
for i := 0; ; i++ {
err = f()
if err == nil {
return
}
if i >= (attempts - 1) {
break
}
time.Sleep(sleep)
sleep *= 2
log.Println("retrying after error:", err)
}
return fmt.Errorf("after %d attempts, last error: %s", attempts, err) }
//Save Data function
type Records struct {
Messages [][]byte
}
func (s *Service) SaveData(records Records, lastSentPlace uint) error {
//lastSentPlace is sent as 0 to begin with.
for i := lastSentPlace; i <= records.Place-1; i++ {
var msg Records
msg.Unmarshal(records.Messages[i])
order := MyStruct{
Fruit: msg.Fruit,
Burger: msg.Burger,
Fries: msg.Fries,
}
err := s.db.UpdateOrder(context.TODO(), nil , order)
if err != nil {
logging.Error("Error occured...")
}
}return nil}
//Service function (This runs as a batch, which is why we need retrying)
func (s *Service) MyServiceFunction(ctx context.Context, place uint, length uint) (err error) {
var lastSentPlace = place
records, err := s.Poll(context.Background(), place, length)
if err != nil {
logging.Info(err)
}
我认为,问题在于我尝试实现重试函数的方式,我已经尝试调试了一段时间,但是作为该语言的新手,我真的卡住了。我想做的是,如果没有找到任何记录,就实现回退。任何帮助都非常感谢。
偶然的你
潇湘沐
慕码人8056858
白衣非少年
相关分类