public async Task PublishAsync(Type messageType, object message, TimeSpan?delay = null, MessageOptions options = null, CancellationToken cancellationToken = default) { if (messageType == null || message == null) { return; } await EnsureTopicCreatedAsync(cancellationToken).AnyContext(); await PublishImplAsync(GetMappedMessageType(messageType), message, delay, options ?? new MessageOptions(), cancellationToken).AnyContext(); }
protected abstract Task PublishImplAsync(string messageType, object message, TimeSpan?delay, MessageOptions options, CancellationToken cancellationToken);
public static Task PublishAsync <T>(this IMessagePublisher publisher, T message, TimeSpan?delay = null, MessageOptions options = null) where T : class { return(publisher.PublishAsync(typeof(T), message, delay, options)); }
public Task PublishAsync(Type messageType, object message, TimeSpan?delay = null, MessageOptions options = null, CancellationToken cancellationToken = default) { return(Task.CompletedTask); }
protected override async Task PublishImplAsync(string messageType, object message, TimeSpan?delay, MessageOptions options, CancellationToken cancellationToken) { Interlocked.Increment(ref _messagesSent); _messageCounts.AddOrUpdate(messageType, t => 1, (t, c) => c + 1); var mappedType = GetMappedMessageType(messageType); if (_subscribers.IsEmpty) { return; } bool isTraceLogLevelEnabled = _logger.IsEnabled(LogLevel.Trace); if (delay.HasValue && delay.Value > TimeSpan.Zero) { if (isTraceLogLevelEnabled) { _logger.LogTrace("Schedule delayed message: {MessageType} ({Delay}ms)", messageType, delay.Value.TotalMilliseconds); } SendDelayedMessage(mappedType, message, delay.Value); return; } byte[] body = SerializeMessageBody(messageType, message); var messageData = new Message(() => DeserializeMessageBody(messageType, body)) { Type = messageType, ClrType = mappedType, Data = body }; try { await SendMessageToSubscribersAsync(messageData).AnyContext(); } catch (Exception ex) { // swallow exceptions from subscriber handlers for the in memory bus _logger.LogWarning(ex, "Error sending message to subscribers: {ErrorMessage}", ex.Message); } }