예제 #1
0
        /// <summary>
        /// Performs message publication.
        /// </summary>
        /// <typeparam name="T">Type to publish</typeparam>
        /// <param name="message">Message to publish</param>
        public void Publish <T>(T message)
        {
            var confirmableMessage = new ConfirmableMessage(message, typeof(T));

            if (PublishImmediately)
            {
                try
                {
                    if (_publishSettings.UsePublisherConfirms)
                    {
                        _confirmer.RecordPublicationAttempt(confirmableMessage);
                    }
                    _serviceBus.Publish(message, context => context.SetHeader("ClientMessageId", confirmableMessage.Id));
                }
                catch (Exception ex)
                {
                    if (_publishSettings.UsePublisherConfirms)
                    {
                        _confirmer.RecordPublicationFailure(new[] { confirmableMessage.Id });
                    }
                    _log.Error("An error occurred while publishing to MassTransit", ex);
                }
            }
            else
            {
                _unpublishedMessageBuffer.Enqueue(confirmableMessage);
            }
        }
예제 #2
0
 private void PublishStoredMessage(ConfirmableMessage confirmableMessage, bool forcePublish = false)
 {
     if (PublicationEnabled || forcePublish)
     {
         try
         {
             _confirmer.RecordPublicationAttempt(confirmableMessage);
             _serviceBus.Publish(confirmableMessage.Message, confirmableMessage.Type, context => context.SetHeader("ClientMessageId", confirmableMessage.Id));
         }
         catch (Exception ex)
         {
             _confirmer.RecordPublicationFailure(new[] { confirmableMessage.Id });
             _log.Error("An error occurred while publishing to MassTransit", ex);
         }
     }
     else
     {
         _unpublishedMessageBuffer.Enqueue(confirmableMessage);
     }
 }
예제 #3
0
        /// <summary>
        /// Used when attempting to see whether or not publishing can be restarted
        /// </summary>
        private void RepublishOneStoredMessage()
        {
            if (_publicationEnabled || Convert.ToBoolean(_processingBufferedMessages) || Convert.ToBoolean(Interlocked.CompareExchange(ref _retryingPublish, 1, 0)))
            {
                return;
            }

            try
            {
                ConfirmableMessage message = (_messageRepository.GetAndDeleteMessages(_publishSettings.PublisherId, 1)).FirstOrDefault();

                if (message != null)
                {
                    PublishStoredMessage(message, true);
                }
            }
            finally
            {
                Interlocked.Exchange(ref _lastPublishRetryTimestamp, DateTime.UtcNow.Ticks);
                Interlocked.Exchange(ref _retryingPublish, 0);
            }
        }
예제 #4
0
 public void RecordPublicationAttempt(ConfirmableMessage message)
 {
     _unconfirmedMessages.TryAdd(message.Id, message);
 }