public void EventListenerSettingsAreProperlyAppliedToReplyListener(string queueName, string topics) { // Arrange string[] topicNames = topics.Split(","); MicroserviceListener listener = new MicroserviceListener { Queue = queueName, TopicExpressions = topicNames }; MicroserviceReplayListener replayListener = new MicroserviceReplayListener(); // Act replayListener.ApplyListenerSettings(listener); // Assert string[] expectedTopicNames = topicNames.Select(e => $"{ReplayTopicNames.ReplayEventTopicPrefix}{e}").ToArray(); Assert.AreEqual($"{ReplayTopicNames.ReplayEventTopicPrefix}{queueName}", replayListener.Queue); CollectionAssert.AreEqual(expectedTopicNames, replayListener.TopicExpressions.ToArray()); }
/// <summary> /// Publish a replay event command and initiate a replay /// </summary> public virtual void Initiate(ReplayEventsCommand command) { Logger.LogInformation($"Initiating replay from {command.FromTimeStamp} to {command.ToTimeStamp}, " + $"Topic {string.Join(',', command.Topics)}, " + $"Types {string.Join(',', command.Types)}, " + $"DestinationQueue {command.DestinationQueue}. " + $"Process ID {command.ProcessId} and Timestamp {command.Timestamp}"); if (Host.IsListening && !Host.IsPaused) { Logger.LogDebug("Pausing host"); Host.Pause(); } Logger.LogTrace("Setting up manual reset events"); ManualResetEvent startResetEvent = new ManualResetEvent(false); ManualResetEvent endResetEvent = new ManualResetEvent(false); Logger.LogTrace("Setting up random queue names"); string startQueue = Guid.NewGuid().ToString(); string endQueue = Guid.NewGuid().ToString(); Logger.LogDebug($"Setting up replay startlistener with topic {ReplayTopicNames.ReplayStartEventTopic} " + $"and queue {startQueue}"); MicroserviceReplayListener startListener = new MicroserviceReplayListener { Callback = callbackResult => { Logger.LogDebug("Received replay start event, deserializing and checking process id..."); string data = Encoding.Unicode.GetString(callbackResult.Body); DomainEvent domainEvent = JsonConvert.DeserializeObject <DomainEvent>(data); if (domainEvent.ProcessId.ToString() != command.ProcessId.ToString()) { return; } Logger.LogInformation($"Start event received with process id {command.ProcessId}"); startResetEvent.Set(); }, Queue = startQueue, TopicExpressions = new [] { ReplayTopicNames.ReplayStartEventTopic } }; Logger.LogDebug($"Setting up replay endlistener with topic {ReplayTopicNames.ReplayEndEventTopic} " + $"and queue {endQueue}"); MicroserviceReplayListener endListener = new MicroserviceReplayListener { Callback = callbackResult => { Logger.LogDebug("Received replay end event, deserializing and checking process id..."); string data = Encoding.Unicode.GetString(callbackResult.Body); DomainEvent domainEvent = JsonConvert.DeserializeObject <DomainEvent>(data); if (domainEvent.ProcessId.ToString() != command.ProcessId.ToString()) { return; } Logger.LogInformation($"End event received with process id {command.ProcessId}"); endResetEvent.Set(); }, Queue = endQueue, TopicExpressions = new [] { ReplayTopicNames.ReplayEndEventTopic } }; Logger.LogTrace("Setting up start and end listeners in host"); Host.StartListener = startListener; Host.EndListener = endListener; Logger.LogTrace("Starting replay"); Host.StartReplay(); Logger.LogDebug("Publishing replay command to auditlogger"); ReplayEventsResult result = CommandPublisher.PublishAsync <ReplayEventsResult>(command).Result; Logger.LogInformation($"{result.AmountOfEvents} event(s) will be replayed"); Logger.LogDebug("Awaiting start event"); startResetEvent.WaitOne(); endResetEvent.WaitOne(); Logger.LogDebug("End event received, ending replay"); Host.StopReplay(); if (!Host.IsListening) { return; } Logger.LogDebug("Resuming host"); Host.Resume(); }