/// <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); } }
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); } }
/// <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); } }
public void RecordPublicationAttempt(ConfirmableMessage message) { _unconfirmedMessages.TryAdd(message.Id, message); }