/// <summary>
        /// Регистрирует сообщение перед отправкой, вызывать до завершения транзакции основной логики применения изменений.
        /// Используется для предотвращения потери сообщения, если после завершения транзакции не удалось доставить сообщение в Rabbit
        /// </summary>
        /// <typeparam name="TMessage">тип сообщения</typeparam>
        /// <param name="message">сообщение</param>
        /// <returns></returns>
        public async Task <RegisterMessageResponse> RegisterBeforePublishAsync <TMessage>(
            TMessage message,
            [CallerMemberName] string callerMemberName = null) where TMessage : class
        {
            var messageTypeFullName = message.GetType().FullName;

            var section             = _configuration.GetSection(RabbitMqProducerGlossary.RabbitMqProducerConfigSectionKey);
            var checkTransactionUrl = section[messageTypeFullName];

            if (string.IsNullOrEmpty(checkTransactionUrl) == true)
            {
                throw new InvalidOperationException($"Can't find checkTransactionUrl for messageType = {messageTypeFullName} in section = {RabbitMqProducerGlossary.RabbitMqProducerConfigSectionKey}");
            }

            var request = new RegisterMessageRequest
            {
                CheckTransactionUrl      = checkTransactionUrl,
                JMessage                 = message.Serialize(),
                MessageTypeFullName      = messageTypeFullName,
                ProducerApplicationName  = _applicationName,
                ProducerCallerMemberName = callerMemberName,
                ProducerHost             = System.Environment.MachineName
            };

            var res = await _messageHttpService.RegisterAsync(request : request,
                                                              callerMemberName : callerMemberName);

            return(res);
        }
        public async Task <RegisterMessageResponse> RegisterAsync([FromBody] RegisterMessageRequest request)
        {
            request.RequiredArgumentNotNull(nameof(request));
            request.RequiredArgumentNotNull(() => request.MessageTypeFullName);
            request.RequiredArgumentNotNull(() => request.JMessage);
            request.RequiredArgumentNotNull(() => request.CheckTransactionUrl);
            request.RequiredArgumentNotNull(() => request.ProducerApplicationName);
            request.RequiredArgumentNotNull(() => request.ProducerCallerMemberName);
            request.RequiredArgumentNotNull(() => request.ProducerHost);

            var hash = Goober.Core.Utils.HashUtils.GetMd5Hash(request.JMessage);

            var notPublishedSameMessage = await _messageRepository.GetNotPublishedAsync(
                messageTypeFullName : request.MessageTypeFullName,
                hash : hash);

            if (notPublishedSameMessage != null)
            {
                return(new RegisterMessageResponse
                {
                    Id = notPublishedSameMessage.Id,
                    Hash = notPublishedSameMessage.Hash,
                    RowVersion = notPublishedSameMessage.RowVersion
                });
            }

            var newRec = new MessageModel {
                CheckTransactionUrl = request.CheckTransactionUrl,
                MessageTypeFullName = request.MessageTypeFullName,
                Hash     = hash,
                JMessage = request.JMessage,
                ProducerApplicationName  = request.ProducerApplicationName,
                ProducerCallerMemberName = request.ProducerCallerMemberName,
                ProducerHost             = request.ProducerHost
            };

            await _messageRepository.InsertAsync(newRec);

            return(new RegisterMessageResponse
            {
                Id = newRec.Id,
                Hash = newRec.Hash,
                RowVersion = newRec.RowVersion
            });
        }
Esempio n. 3
0
 public async Task <RegisterMessageResponse> RegisterAsync(RegisterMessageRequest request,
                                                           [CallerMemberName] string callerMemberName = null)
 => await ExecutePostAsync <RegisterMessageResponse, RegisterMessageRequest>(
     path : "/api/message/register",
     request : request,
     callerMemberName : callerMemberName);