private void OnMessageReceived(object sender, BrokeredMessageEventArgs args) { // NOTE: type information does not belong here. It's a responsibility // of the serializer to be self-contained and put any information it // might need for rehydration. var message = args.Message; object payload; using (var stream = message.GetBody<Stream>()) using (var reader = new StreamReader(stream)) { try { payload = this.serializer.Deserialize(reader); } catch (SerializationException e) { message.SafeDeadLetter(e.Message, e.ToString()); return; } } // TODO: have a better trace correlation mechanism (that is used in both the sender and receiver). string traceIdentifier = BuildTraceIdentifier(message); try { ProcessMessage(traceIdentifier, payload); } catch (Exception e) { if (args.Message.DeliveryCount > MaxProcessingRetries) { Trace.TraceWarning("An error occurred while processing the message" + traceIdentifier + " and will be dead-lettered:\r\n{0}", e); message.SafeDeadLetter(e.Message, e.ToString()); } else { Trace.TraceWarning("An error occurred while processing the message" + traceIdentifier + " and will be abandoned:\r\n{0}", e); message.SafeAbandon(); } return; } Trace.WriteLine("The message" + traceIdentifier + " has been processed and will be completed."); message.SafeComplete(); }
public void SaveMessage(object sender, BrokeredMessageEventArgs args) { this.eventLog.Save(args.Message.ToMessageLogEntity()); args.Message.SafeComplete(); }