in v2/sender.go [70:110]
func (d *Sender) SendMessage(ctx context.Context, mb MessageBody, options ...func(msg *azservicebus.Message) error) 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())
}
msg, err := d.ToServiceBusMessage(ctx, mb, options...)
if 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() {
err := d.sendMessage(ctx, msg, nil) // sendMessageOptions currently does nothing
if err != nil {
errChan <- fmt.Errorf("failed to send message: %w", err)
} else {
errChan <- nil
}
}()
select {
case <-ctx.Done():
sender.Metric.IncSendMessageFailureCount()
return fmt.Errorf("failed to send message: %w", ctx.Err())
case err := <-errChan:
if err == nil {
sender.Metric.IncSendMessageSuccessCount()
} else {
sender.Metric.IncSendMessageFailureCount()
}
return err
}
}