in cmd/pinpi/main.go [102:128]
func worker(ctx context.Context, taskChan <-chan task, client obj.Client) {
defer wg.Done()
logger := logger.With("worker id", ctx.Value(workerContextKey("workerId")))
defer logger.Sync()
defer logger.Infow("worker exiting")
logger.Info("worker started")
b := retry.WithMaxRetries(3, retry.NewExponential(1*time.Second))
for task := range taskChan {
select {
case <-ctx.Done():
return
default:
}
if err := retry.Do(ctx, b, func(ctx context.Context) error {
if err := process(ctx, &task, logger, client); err != nil {
return retry.RetryableError(err)
}
return nil
}); err != nil {
logger.Errorw("process failed", "error", err)
task.cancel()
}
}
}