public void should_send_MessageProcessingFailed_if_unable_to_deserialize_message() { SetupPeersHandlingMessage <MessageProcessingFailed>(_peerUp); _bus.Start(); var command = new FakeCommand(123); _messageSerializer.AddSerializationExceptionFor(command.TypeId(), "Serialization error"); using (SystemDateTime.PauseTime()) using (MessageId.PauseIdGeneration()) { var transportMessage = command.ToTransportMessage(); var messageProcessingFailedBytes = new MessageProcessingFailed(null, null, null, DateTime.UtcNow, null).ToTransportMessage().Content; _messageSerializer.AddSerializationFuncFor <MessageProcessingFailed>(x => { x.FailingMessage.ShouldEqual(transportMessage); x.ExceptionUtcTime.ShouldEqual(SystemDateTime.UtcNow); x.ExceptionMessage.ShouldContain("Unable to deserialize message"); return(messageProcessingFailedBytes); }); _transport.RaiseMessageReceived(transportMessage); var processingFailedTransportMessage = new TransportMessage(MessageUtil.TypeId <MessageProcessingFailed>(), messageProcessingFailedBytes, _self); _transport.ExpectExactly(new TransportMessageSent(processingFailedTransportMessage, _peerUp)); } }
private void SendMessageProcessingFailedIfNeeded(MessageDispatch dispatch, DispatchResult dispatchResult, TransportMessage failingTransportMessage = null) { if (dispatchResult.Errors.Count == 0 || dispatchResult.Errors.All(error => error is DomainException)) { return; } if (failingTransportMessage == null) { failingTransportMessage = ToTransportMessage(dispatch.Message, MessageId.NextId()); } string jsonMessage; try { jsonMessage = JsonConvert.SerializeObject(dispatch.Message); } catch (Exception ex) { jsonMessage = string.Format("Unable to serialize message :{0}{1}", System.Environment.NewLine, ex); } var errorMessages = dispatchResult.Errors.Select(error => error.ToString()); var errorMessage = string.Join(System.Environment.NewLine + System.Environment.NewLine, errorMessages); var messageProcessingFailed = new MessageProcessingFailed(failingTransportMessage, jsonMessage, errorMessage, SystemDateTime.UtcNow, dispatchResult.ErrorHandlerTypes.Select(x => x.FullName).ToArray()); var peers = _directory.GetPeersHandlingMessage(messageProcessingFailed); SendTransportMessage(ToTransportMessage(messageProcessingFailed, MessageId.NextId()), peers); }
private void HandleDeserializationError(MessageTypeId messageTypeId, Stream messageStream, OriginatorInfo originator, Exception exception, TransportMessage transportMessage) { var dumpLocation = DumpMessageOnDisk(messageTypeId, messageStream); var errorMessage = $"Unable to deserialize message {messageTypeId.FullName}. Originator: {originator.SenderId}. Message dumped at: {dumpLocation}\r\n{exception}"; _logger.Error(errorMessage); if (!_configuration.IsErrorPublicationEnabled || !IsRunning) { return; } var processingFailed = new MessageProcessingFailed(transportMessage, String.Empty, errorMessage, SystemDateTime.UtcNow, null); Publish(processingFailed); }
private void HandleDeserializationError(MessageTypeId messageTypeId, byte[] messageBytes, OriginatorInfo originator, Exception exception, TransportMessage transportMessage) { var dumpLocation = DumpMessageOnDisk(messageTypeId, messageBytes); var errorMessage = string.Format("Unable to deserialize message {0}. Originator: {1}. Message dumped at: {2}\r\n{3}", messageTypeId.FullName, originator.SenderId, dumpLocation, exception); _logger.Error(errorMessage); if (!_isRunning) { return; } var processingFailed = new MessageProcessingFailed(transportMessage, String.Empty, errorMessage, SystemDateTime.UtcNow, null); Publish(processingFailed); }
public void should_send_a_MessageProcessingFailed_on_unknown_error_with_local_processing() { using (SystemDateTime.PauseTime()) using (MessageId.PauseIdGeneration()) { var command = new FakeCommand(123); var commandJson = JsonConvert.SerializeObject(command); var exception = new Exception("Exception message"); SetupDispatch(command, error: exception); SetupPeersHandlingMessage <FakeCommand>(_self); _bus.Send(command); var expectedTransportMessage = new MessageProcessingFailed(command.ToTransportMessage(_self), commandJson, exception.ToString(), SystemDateTime.UtcNow, new[] { typeof(FakeMessageHandler).FullName }).ToTransportMessage(_self); _transport.Expect(new TransportMessageSent(expectedTransportMessage, _peerUp)); } }
public void should_send_a_MessageProcessingFailed_on_unknown_event_error() { using (SystemDateTime.PauseTime()) using (MessageId.PauseIdGeneration()) { var message = new FakeEvent(123); var messageJson = JsonConvert.SerializeObject(message); var exception = new Exception("Exception message"); SetupDispatch(message, error: exception); var transportMessageReceived = message.ToTransportMessage(_peerUp); _transport.RaiseMessageReceived(transportMessageReceived); var expectedTransportMessage = new MessageProcessingFailed(transportMessageReceived, messageJson, exception.ToString(), SystemDateTime.UtcNow, new[] { typeof(FakeMessageHandler).FullName }).ToTransportMessage(_self); _transport.Expect(new TransportMessageSent(expectedTransportMessage, _peerUp)); } }
private void HandleDispatchErrors(MessageDispatch dispatch, DispatchResult dispatchResult, TransportMessage failingTransportMessage = null) { if (!_configuration.IsErrorPublicationEnabled || !IsRunning || dispatchResult.Errors.Count == 0 || dispatchResult.Errors.All(error => error is DomainException)) { return; } var errorMessages = dispatchResult.Errors.Select(error => error.ToString()); var errorMessage = string.Join(System.Environment.NewLine + System.Environment.NewLine, errorMessages); try { if (failingTransportMessage == null) { failingTransportMessage = ToTransportMessage(dispatch.Message); } } catch (Exception ex) { HandleDispatchErrorsForUnserializableMessage(dispatch.Message, ex, errorMessage); return; } string jsonMessage; try { jsonMessage = JsonConvert.SerializeObject(dispatch.Message); } catch (Exception ex) { jsonMessage = $"Unable to serialize message :{System.Environment.NewLine}{ex}"; } var messageProcessingFailed = new MessageProcessingFailed(failingTransportMessage, jsonMessage, errorMessage, SystemDateTime.UtcNow, dispatchResult.ErrorHandlerTypes.Select(x => x.FullName).ToArray()); Publish(messageProcessingFailed); }
public void should_send_a_MessageProcessingFailed_on_dispatch_error() { SetupPeersHandlingMessage <MessageProcessingFailed>(_peerUp); _bus.Start(); using (SystemDateTime.PauseTime()) using (MessageId.PauseIdGeneration()) { var command = new FakeCommand(123); var transportMessageReceived = command.ToTransportMessage(_peerUp); var dispatch = _bus.CreateMessageDispatch(transportMessageReceived); var exception = new Exception("Test error"); dispatch.SetHandlerCount(1); var invokerMock = new Mock <IMessageHandlerInvoker>(); invokerMock.SetupGet(x => x.MessageHandlerType).Returns(typeof(FakeMessageHandler)); dispatch.SetHandled(invokerMock.Object, exception); var commandJson = JsonConvert.SerializeObject(command); var expectedTransportMessage = new MessageProcessingFailed(transportMessageReceived, commandJson, exception.ToString(), SystemDateTime.UtcNow, new[] { typeof(FakeMessageHandler).FullName }).ToTransportMessage(_self); _transport.Expect(new TransportMessageSent(expectedTransportMessage, _peerUp)); } }