in v2/sender.go [142:186]
func (d *Sender) SendMessageBatch(ctx context.Context, messages []*azservicebus.Message) error {
// Check if there is a context error before doing anything since
// we rely on context failures to detect if the sender is dead.
if ctx.Err() != nil {
return fmt.Errorf("failed to send message: %w", ctx.Err())
}
batch, err := d.newMessageBatch(ctx, &azservicebus.MessageBatchOptions{})
if err != nil {
return err
}
for _, msg := range messages {
if err := batch.AddMessage(msg, nil); err != nil {
return err
}
}
if d.options.SendTimeout > 0 {
var cancel func()
ctx, cancel = context.WithTimeout(ctx, d.options.SendTimeout)
defer cancel()
}
errChan := make(chan error)
go func() {
if err := d.sendMessageBatch(ctx, batch, nil); err != nil {
errChan <- fmt.Errorf("failed to send message batch: %w", err)
} else {
errChan <- nil
}
}()
select {
case <-ctx.Done():
sender.Metric.IncSendMessageFailureCount()
return fmt.Errorf("failed to send message batch: %w", ctx.Err())
case err := <-errChan:
if err == nil {
sender.Metric.IncSendMessageSuccessCount()
} else {
sender.Metric.IncSendMessageFailureCount()
}
return err
}
}