/// <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 }); }
public async Task <RegisterMessageResponse> RegisterAsync(RegisterMessageRequest request, [CallerMemberName] string callerMemberName = null) => await ExecutePostAsync <RegisterMessageResponse, RegisterMessageRequest>( path : "/api/message/register", request : request, callerMemberName : callerMemberName);