コード例 #1
0
 private void OnNext(IPublisherMessageBatching batching)
 {
     foreach (var observer in _observers)
     {
         observer.OnNext(batching);
     }
 }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 public PublishingException(IPublisherMessageBatching batching, string message, Exception innerException) : base(
         batching, message, innerException)
 {
 }
コード例 #5
0
 public PublishingException(IPublisherMessageBatching batching, Exception innerException) : this(batching,
                                                                                                 "Failed to publish batching.", innerException)
 {
 }
コード例 #6
0
 protected EasyRabbitMqClientException(IPublisherMessageBatching batching, string message, Exception exception)
 {
     Batching = batching;
 }
コード例 #7
0
 public PublishingNotConfirmedException(IPublisherMessageBatching batching)
     : base(batching, "The publishing was not confirmed.", null)
 {
 }