private static IDomainEventSerializer GetDomainEventSerializer() { IDomainEventSerializer serializer = null; string eventSerializerTypeName = ConfigurationManager.AppSettings["eventSerializer"]; if (eventSerializerTypeName == null) { serializer = new DomainEventXmlSerializer(); } else { Type serializerType = Type.GetType(eventSerializerTypeName); if (serializerType == null) { throw new InfrastructureException("The serializer defined by type '{0}' doesn't exist.", eventSerializerTypeName); } serializer = (IDomainEventSerializer)Activator.CreateInstance(serializerType); } return(serializer); }
private void worker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker localWorker = sender as BackgroundWorker; if (localWorker.CancellationPending) { e.Cancel = true; return; } List <string> allMessageIds = e.Argument as List <string>; var messageCount = allMessageIds.Count; List <DomainEventMessageContent> messageContents = new List <DomainEventMessageContent>(); using (MessageQueue messageQueue = new MessageQueue(this.EventMessageQueue)) { messageQueue.MessageReadPropertyFilter.SentTime = true; for (int i = 0; i < messageCount; i++) { Message message = messageQueue.PeekById(allMessageIds[i], this.EventMessageReceiveTimeout); var messageContent = new DomainEventMessageContent(message); messageContents.Add(messageContent); } messageQueue.Close(); } var sortedMessageContents = messageContents.OrderBy(mc => mc.SentTime); foreach (var mc in sortedMessageContents) { bool canRemove = true; try { if (!mc.IsValidMessage) { throw new Exception("Invalid Message Content."); } OnProcessing(mc); Type eventType = Type.GetType(mc.Type); if (eventType != null) { DomainEventXmlSerializer xmlSerializer = new DomainEventXmlSerializer(); var domainEvent = xmlSerializer.Deserialize(eventType, mc.Bytes); messageDispatcher.DispatchMessage(domainEvent); } else { canRemove = false; } } catch (Exception ex) { OnProcessFailed(mc.MessageId, mc, ex); canRemove = false; } finally { if (canRemove) { using (MessageQueue messageQueue = new MessageQueue(this.EventMessageQueue)) { try { messageQueue.ReceiveById(mc.MessageId, this.EventMessageReceiveTimeout); } finally { messageQueue.Close(); } } } } } }