private void OnNext(IPublisherMessageBatching batching) { foreach (var observer in _observers) { observer.OnNext(batching); } }
public async Task PublishAsync(IPublisherMessageBatching batching, CancellationToken cancellationToken = default) { if (batching is null) { throw new ArgumentNullException(nameof(batching)); } if (_disposed) { throw new ObjectDisposedException(nameof(Publisher)); } try { await _behavior.ExecuteAsync(batching, null, cancellationToken); OnNext(batching); } catch (PublishingNotConfirmedException ex) { OnError(ex); } catch (PublishingException ex) { OnError(ex); if (batching.Count > ex.Batching.Count) { OnNext(new PublisherMessageBatching(this, batching.Except(ex.Batching))); } } catch (EasyRabbitMqClientException ex) { OnError(new PublishingException(batching, ex.Message, ex)); } catch (Exception ex) { OnError(new PublishingException(batching, ex)); } }
public async Task PublishAsync(IPublisherMessageBatching batching, CancellationToken cancellationToken) { if (_disposed) { throw new ObjectDisposedException(nameof(RabbitMqPublisher)); } if (!batching.Any()) { return; } await Task.Factory.StartNew(() => { const string lastException = "LastException"; try { var failedMessages = new HashSet <IPublisherMessage>(0); var hasSuccessMessages = false; using var model = Connect().CreateModel(); try { model.ConfirmSelect(); var batch = model.CreateBasicPublishBatch(); foreach (var message in batching) { try { hasSuccessMessages = batch.Add(model, message) || hasSuccessMessages; } catch (Exception ex) { message.AddHeader(lastException, ex.ToString()); failedMessages.Add(message); } } if (batching.Count == failedMessages.Count) { throw new PublishingException(batching, "All messages failed.", null); } if (cancellationToken.IsCancellationRequested || !hasSuccessMessages) { return(Task.CompletedTask); } batch.Publish(); if (!model.WaitForConfirms(batching.PublishingTimeout)) { throw new PublishingNotConfirmedException( new PublisherMessageBatching(batching.Publisher, batching)); } if (!failedMessages.Any()) { return(Task.CompletedTask); } throw new PublishingException(new PublisherMessageBatching(batching.Publisher, failedMessages), "A few messages failed.", null); } finally { model.Close(); } } catch (PublishingException) { throw; } catch (Exception ex) { throw new PublishingException(batching, ex); } }, cancellationToken); }
public PublishingException(IPublisherMessageBatching batching, string message, Exception innerException) : base( batching, message, innerException) { }
public PublishingException(IPublisherMessageBatching batching, Exception innerException) : this(batching, "Failed to publish batching.", innerException) { }
protected EasyRabbitMqClientException(IPublisherMessageBatching batching, string message, Exception exception) { Batching = batching; }
public PublishingNotConfirmedException(IPublisherMessageBatching batching) : base(batching, "The publishing was not confirmed.", null) { }