public interface IFault<TMessage>
{
/// <summary>
/// The message that failed to be consumed
/// </summary>
TMessage FailedMessage { get; set; }
/// <summary>
/// The type of fault that occurred
/// </summary>
string FaultType { get; }
/// <summary>
/// Messages associated with the exception
/// </summary>
List<string> Messages { get; set; }
/// <summary>
/// When the exception occurred
/// </summary>
DateTime OccurredAt { get; set; }
/// <summary>
/// A stack trace related to the exception
/// </summary>
List<string> StackTrace { get; set; }
}
public class FaultHandler : Consumes<IFault>.Context
{
readonly IFaultedMessageCollection _collection;
public FaultHandler(IFaultedMessageCollection collection)
{
_collection = collection;
}
public void Consume(IConsumeContext<IFault> ctx)
{
var message = ctx.Message;
var messageData = Newtonsoft.Json.JsonConvert.SerializeObject(message..FailedMessage);
var faultedMessage = new FaultedMessage
{
MessageType = message.FailedMessage.GetType().AssemblyQualifiedName,
OccurredAt = message.OccurredAt,
Messages = message.Messages,
StackTrace = message.StackTrace,
MessageData = messageData,
SourceAddress = ctx.SourceAddress.ToString()
};
_collection.Save(faultedMessage);
}
}