示例#1
0
        public void ItExecutesTasksAtTheSpecifiedInterval()
        {
            var semaphoreFile = Path.GetTempFileName();

            File.Delete(semaphoreFile);

            var intervalSeconds = 2;

            var taskScheduler = new TaskScheduler(TaskQueue.Redis("localhost:6379"));

            taskScheduler.AddScheduledTask(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile),
                                           TimeSpan.FromSeconds(intervalSeconds), "test");
            taskScheduler.Tick();

            File.Exists(semaphoreFile).Should().Be(false);

            // Confirm Scheduled Task Ran once
            Thread.Sleep(((intervalSeconds) * 1000) + 10);
            taskScheduler.Tick();
            File.Exists(semaphoreFile).Should().Be(true);
            File.ReadAllText(semaphoreFile).Should().Be(TaskQueueTestFixture.SemaphoreText);

            // Confirm Ran TWICE
            Thread.Sleep(((intervalSeconds) * 1000) + 10);
            taskScheduler.Tick();
            File.Exists(semaphoreFile).Should().Be(true);
            File.ReadAllText(semaphoreFile).Should()
            .Be(TaskQueueTestFixture.SemaphoreText + TaskQueueTestFixture.SemaphoreText);
        }
示例#2
0
        public void ItExecutesAScheduledTaskAtTheSpecifiedDateTimeOnlyOnce()
        {
            Action <string, TaskScheduler> configureSchedulerAction = (semaphoreFile, taskScheduler) =>
            {
                taskScheduler.AddScheduledTask(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile),
                                               DateTime.UtcNow + TimeSpan.FromSeconds(IntervalSeconds), RandomTaskName);
            };

            AssertTaskSchedulerWritesSemaphoreOnlyOnce(configureSchedulerAction);
        }
示例#3
0
        public void ItExecutesARecurringTaskAtTheSpecifiedCrontabInterval()
        {
            Action <string, TaskScheduler> configureSchedulerAction = (semaphoreFile, taskScheduler) =>
            {
                taskScheduler.AddRecurringTask(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile),
                                               $"*/{IntervalSeconds} * * * * *", RandomTaskName);
            };

            AssertTaskSchedulerWritesSemaphoreTwice(configureSchedulerAction);
        }
示例#4
0
        public void ItExecutesTasksOnlyOnceWhenUsingMultipleConsumers()
        {
            var semaphoreFile = Path.GetTempFileName();

            File.Delete(semaphoreFile);
            File.Create(semaphoreFile).Close();

            var intervalSeconds = 5;

            var taskSchedulers = new[]
            {
                new TaskScheduler(TaskQueue.Redis("localhost:6379")),
                new TaskScheduler(TaskQueue.Redis("localhost:6379")),
                new TaskScheduler(TaskQueue.Redis("localhost:6379")),
                new TaskScheduler(TaskQueue.Redis("localhost:6379"))
            };

            foreach (var taskScheduler in taskSchedulers)
            {
                taskScheduler.AddScheduledTask(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile),
                                               TimeSpan.FromSeconds(intervalSeconds), "test");
            }

            Thread.Sleep(((intervalSeconds) * 1000) + 1000);

            // Ran only once
            Task.WaitAll(
                taskSchedulers.Select(
                    taskScheduler =>
                    Task.Run(() => taskScheduler.Tick())).ToArray(), 1000);

            File.Exists(semaphoreFile).Should().Be(true);
            File.ReadAllText(semaphoreFile).Should().Be(TaskQueueTestFixture.SemaphoreText);


            // Ran only twice
            Thread.Sleep(((intervalSeconds) * 1000) + 1000);
            Task.WaitAll(
                taskSchedulers.Select(
                    taskScheduler =>
                    Task.Run(() => taskScheduler.Tick())).ToArray(), 1000);
            File.ReadAllText(semaphoreFile).Should()
            .Be(TaskQueueTestFixture.SemaphoreText + TaskQueueTestFixture.SemaphoreText);
        }
        public async Task ItsTasksAreConsumedOnlyOnceByMultipleConsumers()
        {
            var numberOfJobs = 4;

            var sharedTaskQueueName = nameof(ItsTasksAreConsumedOnlyOnceByMultipleConsumers);
            var consumers           = new[]
            {
                new TaskQueueTestFixture(sharedTaskQueueName),
                new TaskQueueTestFixture(sharedTaskQueueName)
            };

            var semaphoreFiles = new List <string>();

            for (int i = 0; i < numberOfJobs; ++i)
            {
                var path = Path.GetTempFileName();
                File.Delete(path);
                semaphoreFiles.Add(path);

                var sharedTaskQueue = consumers[0].TaskQueue;
                sharedTaskQueue.Enqueue(() => TaskQueueTestFixture.WriteSempaphore(path));
            }

            var tasks = new List <Task>();

            for (int i = 0; i < numberOfJobs; i += consumers.Length)
            {
                foreach (var consumer in consumers)
                {
                    var task = Task.Run(() => consumer.TaskQueue.ExecuteNext());
                    tasks.Add(task);
                }
            }

            foreach (var task in tasks)
            {
                await task;
            }

            foreach (var semaphoreFile in semaphoreFiles)
            {
                File.ReadAllText(semaphoreFile).Should().Be(TaskQueueTestFixture.SemaphoreText);
            }
        }
示例#6
0
        public void ItContinuesListeningWhenATaskThrowsAnException()
        {
            var waitTime = 5000;

            var taskClient    = new TaskClient(TaskQueue.Redis("localhost:6379", nameof(ItContinuesListeningWhenATaskThrowsAnException)));
            var semaphoreFile = Path.GetTempFileName();

            taskClient.TaskQueue.Enqueue(() => Throw());
            taskClient.TaskQueue.Enqueue(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile));

            var task = Task.Run(() => taskClient.Listen());

            Thread.Sleep(waitTime);

            taskClient.CancelListen();
            task.Wait();

            TaskQueueTestFixture.EnsureSemaphore(semaphoreFile);
        }
示例#7
0
        public void ItContinuesListeningWhenATaskThrowsAnException()
        {
            var waitTime = 5000;

            var taskClient = new TaskClient(
                TaskQueue.Redis(TaskQueueTestFixture.RedisConnectionString, nameof(ItContinuesListeningWhenATaskThrowsAnException)),
                restoreScheduleFromBackup: false);
            var semaphoreFile = Path.GetTempFileName();

            taskClient.TaskQueue.Enqueue(() => Throw());
            taskClient.TaskQueue.Enqueue(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile));

            var task = Task.Run(() => taskClient.Listen());

            Thread.Sleep(waitTime);

            taskClient.CancelListen();
            task.Wait();

            TaskQueueTestFixture.EnsureSemaphore(semaphoreFile);
        }
示例#8
0
        public void ItExecutesTasksOnlyOnceWhenUsingMultipleConsumers(string taskType)
        {
            var semaphoreFile = Path.GetTempFileName();

            File.Delete(semaphoreFile);
            File.Create(semaphoreFile).Close();

            var intervalSeconds = 5;

            var taskSchedulers = new[]
            {
                new TaskScheduler(TaskQueue.Redis(TaskQueueTestFixture.RedisConnectionString), restoreFromBackup: false),
                new TaskScheduler(TaskQueue.Redis(TaskQueueTestFixture.RedisConnectionString), restoreFromBackup: false),
                new TaskScheduler(TaskQueue.Redis(TaskQueueTestFixture.RedisConnectionString), restoreFromBackup: false),
                new TaskScheduler(TaskQueue.Redis(TaskQueueTestFixture.RedisConnectionString), restoreFromBackup: false)
            };

            foreach (var taskScheduler in taskSchedulers)
            {
                if (taskType == "scheduled")
                {
                    taskScheduler.AddScheduledTask(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile),
                                                   TimeSpan.FromSeconds(intervalSeconds), RandomTaskName);
                }

                if (taskType == "recurring")
                {
                    taskScheduler.AddRecurringTask(() => TaskQueueTestFixture.WriteSempaphore(semaphoreFile),
                                                   TimeSpan.FromSeconds(intervalSeconds), RandomTaskName);
                }
            }

            Thread.Sleep(((intervalSeconds) * 1000) + 1000);

            // Ran only once
            Task.WaitAll(
                taskSchedulers.Select(
                    taskScheduler =>
                    Task.Run(() => taskScheduler.Tick())).ToArray(), 1000);

            File.Exists(semaphoreFile).Should().Be(true);
            File.ReadAllText(semaphoreFile).Should().Be(TaskQueueTestFixture.SemaphoreText);


            // Ran only twice (or once if scheduled)
            Thread.Sleep(((intervalSeconds) * 1000) + 1000);
            Task.WaitAll(
                taskSchedulers.Select(
                    taskScheduler =>
                    Task.Run(() => taskScheduler.Tick())).ToArray(), 1000);

            if (taskType == "recurring")
            {
                File.ReadAllText(semaphoreFile).Should()
                .Be(TaskQueueTestFixture.SemaphoreText + TaskQueueTestFixture.SemaphoreText);
            }
            if (taskType == "scheduled")
            {
                File.ReadAllText(semaphoreFile).Should()
                .Be(TaskQueueTestFixture.SemaphoreText);
            }

            taskSchedulers[0].FlushBackupStorage();
        }