/// <summary> /// Waits on the specified queue for messages /// </summary> /// <param name="queue"></param> /// <param name="token"></param> /// <param name="onMessageReceived"></param> private void GetMessages(InMemoryQueue queue, CancellationToken token, ManualResetEvent resetEvent, Action <RawMessage, Action, Action> onMessageReceived) { while (true) { if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } resetEvent.WaitOne(TimeSpan.FromSeconds(15)); RawMessage message = null; while (queue.Dequeue(ref message)) { onMessageReceived( message, () => { /* Ack No Op for InMemory */ }, () => { // Reject puts message back in queue queue.Nack(message); }); } resetEvent.Reset(); } }
public virtual void CanRunWorkItemWithMetrics() { var eventRaised = new ManualResetEvent(false); var metricsClient = new InMemoryMetricsClient(); var behavior = new MetricsQueueBehavior<WorkItemData>(metricsClient, "metric"); var queue = new InMemoryQueue<WorkItemData>(behaviours: new[] { behavior }); queue.Completed += (sender, e) => { eventRaised.Set(); }; var work = new SimpleWorkItem { Id = 1, Data = "Testing" }; queue.Enqueue(work); var item = queue.Dequeue(); item.Complete(); metricsClient.DisplayStats(_writer); Assert.True(eventRaised.WaitOne(TimeSpan.FromMinutes(1))); Assert.Equal(6, metricsClient.Counters.Count); Assert.Equal(4, metricsClient.Timings.Count); Assert.Equal(1, metricsClient.Counters["metric.workitemdata.simple.enqueued"]?.CurrentValue); Assert.Equal(1, metricsClient.Counters["metric.workitemdata.simple.dequeued"]?.CurrentValue); Assert.Equal(1, metricsClient.Counters["metric.workitemdata.simple.completed"]?.CurrentValue); Assert.True(0 < metricsClient.Timings["metric.workitemdata.simple.queuetime"]?.Count); Assert.True(0 < metricsClient.Timings["metric.workitemdata.simple.processtime"]?.Count); }
/// <summary> /// Waits on the specified queue for messages /// </summary> /// <param name="queue"></param> /// <param name="token"></param> /// <param name="onMessageReceived"></param> private void GetMessages(InMemoryQueue queue, CancellationToken token, ManualResetEvent resetEvent, Action<RawMessage, Action, Action> onMessageReceived) { while (true) { if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } resetEvent.WaitOne(TimeSpan.FromSeconds(15)); RawMessage message = null; while (queue.Dequeue(ref message)) { onMessageReceived( message, () => { /* Ack No Op for InMemory */ }, () => { // Reject puts message back in queue queue.Nack(message); }); } resetEvent.Reset(); } }