Exemple #1
0
        protected override IQueue <SimpleWorkItem> GetQueue(int retries = 1, TimeSpan?workItemTimeout = null, TimeSpan?retryDelay = null, int deadLetterMaxItems = 100)
        {
            var queue = new RedisQueue <SimpleWorkItem>(SharedConnection.GetMuxer(), workItemTimeout: workItemTimeout, retries: retries, retryDelay: retryDelay, deadLetterMaxItems: deadLetterMaxItems);

            Debug.WriteLine(String.Format("Queue Id: {0}", queue.QueueId));
            return(queue);
        }
Exemple #2
0
        private void PublishItemCallback(object sender, EventArgs e)
        {
            if (_dte.SelectedItems.Count != 1)
            {
                return;
            }

            SelectedItem item        = _dte.SelectedItems.Item(1);
            ProjectItem  projectItem = item.ProjectItem;

            CrmConn selectedConnection = (CrmConn)SharedGlobals.GetGlobal("SelectedConnection", _dte);

            if (selectedConnection == null)
            {
                return;
            }

            Guid reportId = GetMapping(projectItem, selectedConnection);

            if (reportId == Guid.Empty)
            {
                return;
            }

            CrmServiceClient client = SharedConnection.GetCurrentConnection(selectedConnection.ConnectionString, WindowType, _dte);

            UpdateAndPublishSingle(client, projectItem, reportId);
        }
Exemple #3
0
        private async void UpdateAssembly(AssemblyItem assemblyItem)
        {
            string  projectName = ConnPane.SelectedProject.Name;
            Project project     = GetProjectByName(projectName);

            if (project == null)
            {
                return;
            }

            string connString = ConnPane.SelectedConnection.ConnectionString;

            if (connString == null)
            {
                return;
            }
            CrmServiceClient client = SharedConnection.GetCurrentConnection(connString, WindowType, _dte);

            LockMessage.Content    = "Updating...";
            LockOverlay.Visibility = Visibility.Visible;

            bool success = await Task.Run(() => UpdateCrmAssembly(assemblyItem, client));

            LockOverlay.Visibility = Visibility.Hidden;

            if (success)
            {
                return;
            }

            MessageBox.Show("Error Updating Assembly. See the Output Window for additional details.");
            _dte.StatusBar.Clear();
        }
        private int CountAllKeys()
        {
            var endpoints = SharedConnection.GetMuxer().GetEndPoints(true);

            if (endpoints.Length == 0)
            {
                return(0);
            }

            int count = 0;

            foreach (var endpoint in endpoints)
            {
                var server = SharedConnection.GetMuxer().GetServer(endpoint);

                try {
                    var keys = server.Keys().ToArray();
                    for (int index = 0; index < keys.Length; index++)
                    {
                        _logger.Info($"Server: {server.EndPoint} Key {index}: {keys[index]}");
                    }

                    count += keys.Length;
                } catch (Exception ex) {
                    _logger.Error(ex, "Error getting redis key count");
                }
            }

            return(count);
        }
        protected override IQueue <SimpleWorkItem> GetQueue(int retries = 1, TimeSpan?workItemTimeout = null, TimeSpan?retryDelay = null, int deadLetterMaxItems = 100, bool runQueueMaintenance = true)
        {
            var queue = new RedisQueue <SimpleWorkItem>(SharedConnection.GetMuxer(), workItemTimeout: workItemTimeout,
                                                        retries: retries, retryDelay: retryDelay, deadLetterMaxItems: deadLetterMaxItems, runMaintenanceTasks: runQueueMaintenance, loggerFactory: Log);

            _logger.Debug("Queue Id: {queueId}", queue.QueueId);
            return(queue);
        }
Exemple #6
0
        public RedisLockTests(ITestOutputHelper output) : base(output)
        {
            var muxer = SharedConnection.GetMuxer();

            muxer.FlushAllAsync().GetAwaiter().GetResult();
            _cache      = new RedisCacheClient(muxer, loggerFactory: Log);
            _messageBus = new RedisMessageBus(muxer.GetSubscriber(), loggerFactory: Log);
        }
        public RedisLockTests(ITestOutputHelper output) : base(output)
        {
            var muxer = SharedConnection.GetMuxer();

            muxer.FlushAllAsync().GetAwaiter().GetResult();
            _cache      = new RedisCacheClient(o => o.ConnectionMultiplexer(muxer).LoggerFactory(Log));
            _messageBus = new RedisMessageBus(o => o.Subscriber(muxer.GetSubscriber()).Topic("test-lock").LoggerFactory(Log));
        }
        public void Dispose()
        {
            _cache.Dispose();
            _messageBus.Dispose();
            var muxer = SharedConnection.GetMuxer();

            muxer.FlushAllAsync().GetAwaiter().GetResult();
        }
 /// <summary>
 ///     Execute SQL that returns a DataTable.
 /// </summary>
 /// <param name="fullSql">The SQL to execute.</param>
 /// <param name="parameters">The parameters to use for this query.</param>
 /// <returns>
 ///     A DataTable
 /// </returns>
 public DataTable GetDataTable(string fullSql, object parameters) =>
 ExecuteInternal(() =>
 {
     var dt = new DataTable();
     dt.Load(SharedConnection.ExecuteReader(fullSql, parameters, _transaction,
                                            OneTimeCommandTimeout ?? CommandTimeout));
     return(dt);
 });
        private void PublishItemCallback(object sender, EventArgs e)
        {
            if (_dte.SelectedItems.Count != 1)
            {
                return;
            }

            SelectedItem item        = _dte.SelectedItems.Item(1);
            ProjectItem  projectItem = item.ProjectItem;

            if (projectItem.IsDirty)
            {
                MessageBoxResult result = MessageBox.Show("Save item and publish?", "Unsaved Item",
                                                          MessageBoxButton.YesNo);

                if (result != MessageBoxResult.Yes)
                {
                    return;
                }

                projectItem.Save();
            }

            //Build TypeScript project
            if (projectItem.Name.ToUpper().EndsWith("TS"))
            {
                SolutionBuild solutionBuild = _dte.Solution.SolutionBuild;
                solutionBuild.BuildProject(_dte.Solution.SolutionBuild.ActiveConfiguration.Name, projectItem.ContainingProject.UniqueName, true);
            }

            CrmConn selectedConnection = (CrmConn)SharedGlobals.GetGlobal("SelectedConnection", _dte);

            if (selectedConnection == null)
            {
                return;
            }

            Guid webResourceId = GetMapping(projectItem, selectedConnection);

            if (webResourceId == Guid.Empty)
            {
                return;
            }

            CrmServiceClient client = SharedConnection.GetCurrentConnection(selectedConnection.ConnectionString, WindowType, _dte);

            //Check if < CRM 2011 UR12 (ExecuteMutliple)
            Version version = Version.Parse(selectedConnection.Version);

            if (version.Major == 5 && version.Revision < 3200)
            {
                UpdateAndPublishSingle(client, projectItem, webResourceId);
            }
            else
            {
                UpdateAndPublishMultiple(client, projectItem, webResourceId);
            }
        }
Exemple #11
0
        public void VerifyCacheKeysAreCorrectAfterAbandon()
        {
            var queue = GetQueue(retries: 2, workItemTimeout: TimeSpan.FromMilliseconds(100), retryDelay: TimeSpan.Zero);

            if (queue == null)
            {
                return;
            }

            FlushAll();
            Assert.Equal(0, CountAllKeys());

            using (queue) {
                var db = SharedConnection.GetMuxer().GetDatabase();

                var id = queue.Enqueue(new SimpleWorkItem {
                    Data = "blah", Id = 1
                });
                var workItem = queue.Dequeue();
                workItem.Abandon();
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id));
                Assert.Equal(1, db.ListLength("q:SimpleWorkItem:in"));
                Assert.Equal(0, db.ListLength("q:SimpleWorkItem:work"));
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(1, db.StringGet("q:SimpleWorkItem:" + id + ":attempts"));
                Assert.Equal(4, CountAllKeys());

                workItem = queue.Dequeue();
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id));
                Assert.Equal(0, db.ListLength("q:SimpleWorkItem:in"));
                Assert.Equal(1, db.ListLength("q:SimpleWorkItem:work"));
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(1, db.StringGet("q:SimpleWorkItem:" + id + ":attempts"));
                Assert.Equal(4, CountAllKeys());

                // let the work item timeout
                Thread.Sleep(1000);
                Assert.Equal(1, queue.WorkItemTimeoutCount);
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id));
                Assert.Equal(1, db.ListLength("q:SimpleWorkItem:in"));
                Assert.Equal(0, db.ListLength("q:SimpleWorkItem:work"));
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(2, db.StringGet("q:SimpleWorkItem:" + id + ":attempts"));
                Assert.Equal(4, CountAllKeys());

                // should go to deadletter now
                workItem = queue.Dequeue();
                workItem.Abandon();
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id));
                Assert.Equal(0, db.ListLength("q:SimpleWorkItem:in"));
                Assert.Equal(0, db.ListLength("q:SimpleWorkItem:work"));
                Assert.Equal(1, db.ListLength("q:SimpleWorkItem:dead"));
                Assert.True(db.KeyExists("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(3, db.StringGet("q:SimpleWorkItem:" + id + ":attempts"));
                Assert.Equal(4, CountAllKeys());
            }
        }
 protected override IQueue <SampleQueueWorkItem> GetSampleWorkItemQueue(int retries, TimeSpan retryDelay)
 {
     return(new RedisQueue <SampleQueueWorkItem>(new RedisQueueOptions <SampleQueueWorkItem> {
         ConnectionMultiplexer = SharedConnection.GetMuxer(),
         Retries = retries,
         RetryDelay = retryDelay,
         LoggerFactory = Log
     }));
 }
Exemple #13
0
        public RedisQueueTests(ITestOutputHelper output) : base(output)
        {
            var muxer = SharedConnection.GetMuxer();

            while (muxer.CountAllKeysAsync().GetAwaiter().GetResult() != 0)
            {
                muxer.FlushAllAsync().GetAwaiter().GetResult();
            }
        }
Exemple #14
0
 protected override IQueue <SampleQueueWorkItem> GetSampleWorkItemQueue(int retries, TimeSpan retryDelay)
 {
     return(new RedisQueue <SampleQueueWorkItem>(o => o
                                                 .ConnectionMultiplexer(SharedConnection.GetMuxer())
                                                 .Retries(retries)
                                                 .RetryDelay(retryDelay)
                                                 .LoggerFactory(Log)
                                                 ));
 }
Exemple #15
0
        public async Task VerifyCacheKeysAreCorrect()
        {
            var queue = GetQueue(retries: 3, workItemTimeout: TimeSpan.FromSeconds(2), retryDelay: TimeSpan.Zero, runQueueMaintenance: false);

            if (queue == null)
            {
                return;
            }

            using (queue) {
                var    muxer      = SharedConnection.GetMuxer();
                var    db         = muxer.GetDatabase();
                string listPrefix = muxer.IsCluster() ? "{q:SimpleWorkItem}" : "q:SimpleWorkItem";

                string id = await queue.EnqueueAsync(new SimpleWorkItem { Data = "blah", Id = 1 });

                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id));
                Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:in"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued"));
                Assert.Equal(3, await muxer.CountAllKeysAsync());

                _logger.LogInformation("-----");

                Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed"));
                var workItem = await queue.DequeueAsync();

                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id));
                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in"));
                Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:work"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(5, await muxer.CountAllKeysAsync());

                await Task.Delay(TimeSpan.FromSeconds(4));

                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id));
                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in"));
                Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:work"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed"));
                Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(5, await muxer.CountAllKeysAsync());

                _logger.LogInformation("-----");

                await workItem.CompleteAsync();

                Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id));
                Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued"));
                Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed"));
                Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued"));
                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in"));
                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work"));
                Assert.Equal(0, await muxer.CountAllKeysAsync());
            }
        }
 /// <summary>
 ///     Delete entity in table "Ts" by an un-parameterized WHERE clause.
 ///     If you want to Delete All of the data, call the DeleteAll() command
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="whereClause">The where clause to use to bound a delete, cannot be null, empty, or whitespace</param>
 /// <returns>
 ///     True if deleted, false if not found.
 /// </returns>
 public async Task <bool> DeleteAsync <T>(string whereClause) where T : class
 {
     if (string.IsNullOrWhiteSpace(whereClause))
     {
         throw new ArgumentNullException(nameof(whereClause), "Must specify a where clause for deletion.");
     }
     return(await ExecuteInternalAsync(() =>
                                       SharedConnection.DeleteAsync <T>(whereClause, _transaction, OneTimeCommandTimeout ?? CommandTimeout)));
 }
Exemple #17
0
 protected override ICacheClient GetCacheClient(bool shouldThrowOnSerializationError = true)
 {
     return(new RedisHybridCacheClient(o => o
                                       .ConnectionMultiplexer(SharedConnection.GetMuxer())
                                       .LoggerFactory(Log).ShouldThrowOnSerializationError(shouldThrowOnSerializationError),
                                       localConfig => localConfig
                                       .CloneValues(true)
                                       .ShouldThrowOnSerializationError(shouldThrowOnSerializationError)));
 }
Exemple #18
0
        public override async Task CanHaveMultipleQueueInstancesWithLockingAsync()
        {
            var muxer = SharedConnection.GetMuxer();

            using var cache      = new RedisCacheClient(new RedisCacheClientOptions { ConnectionMultiplexer = muxer, LoggerFactory = Log });
            using var messageBus = new RedisMessageBus(new RedisMessageBusOptions { Subscriber = muxer.GetSubscriber(), Topic = "test-queue", LoggerFactory = Log });
            var distributedLock = new CacheLockProvider(cache, messageBus, Log);

            await CanHaveMultipleQueueInstancesWithLockingImplAsync(distributedLock);
        }
Exemple #19
0
        public static bool UpgradeSQLiteFile(SharedConnection sharedConnection, ILog log)
        {
            var upgrader = DeployChanges.To
                           .SQLiteDatabase(sharedConnection)
                           .WithScriptsEmbeddedInAssembly(Assembly.GetAssembly(typeof(DbHelper)))
                           .LogToNowhere()
                           .Build();

            return(FinishUpgrade(upgrader, log));
        }
 /// <summary>
 ///     Delete entity(s).
 /// </summary>
 /// <typeparam name="T">The type of entity to delete.</typeparam>
 /// <param name="whereClause">The where clause.</param>
 /// <param name="parameters">The parameters to use for this query.</param>
 /// <returns>
 ///     True if deleted, false if not found.
 /// </returns>
 public bool Delete <T>(string whereClause, object parameters) where T : class
 {
     if (string.IsNullOrWhiteSpace(whereClause))
     {
         throw new ArgumentNullException(nameof(whereClause), "Must specify a where clause for deletion.");
     }
     return(ExecuteInternal(() =>
                            SharedConnection.Delete <T>(whereClause, parameters, _transaction,
                                                        OneTimeCommandTimeout ?? CommandTimeout)));
 }
Exemple #21
0
        public override async Task CanHaveMultipleQueueInstancesWithLockingAsync()
        {
            var muxer = SharedConnection.GetMuxer();

            using (var cache = new RedisCacheClient(muxer, loggerFactory: Log)) {
                using (var messageBus = new RedisMessageBus(muxer.GetSubscriber(), "test", loggerFactory: Log)) {
                    var distributedLock = new CacheLockProvider(cache, messageBus, Log);
                    await CanHaveMultipleQueueInstancesWithLockingImplAsync(distributedLock);
                }
            }
        }
Exemple #22
0
        public async Task SendRedisAsync()
        {
            var db = SharedConnection.GetMuxer().GetDatabase();

            int max = 1000;

            for (int index = 0; index <= max; index++)
            {
                await db.SetAddAsync("test", index);
            }
        }
        public RedisLockTests(ITestOutputHelper output) : base(output)
        {
            var muxer = SharedConnection.GetMuxer();

            muxer.FlushAllAsync().GetAwaiter().GetResult();
            _cache = new RedisCacheClient(new RedisCacheClientOptions {
                ConnectionMultiplexer = muxer, LoggerFactory = Log
            });
            _messageBus = new RedisMessageBus(new RedisMessageBusOptions {
                Subscriber = muxer.GetSubscriber(), Topic = "test-lock", LoggerFactory = Log
            });
        }
Exemple #24
0
        public async Task MeasureThroughputWithRandomFailures()
        {
            var queue = GetQueue(retries: 3, workItemTimeout: TimeSpan.FromSeconds(2), retryDelay: TimeSpan.Zero);

            if (queue == null)
            {
                return;
            }

            using (queue) {
                await queue.DeleteQueueAsync();

                const int workItemCount = 1000;
                for (int i = 0; i < workItemCount; i++)
                {
                    await queue.EnqueueAsync(new SimpleWorkItem {
                        Data = "Hello"
                    });
                }
                Assert.Equal(workItemCount, (await queue.GetQueueStatsAsync()).Queued);

                var metrics  = new InMemoryMetricsClient();
                var workItem = await queue.DequeueAsync(TimeSpan.Zero);

                while (workItem != null)
                {
                    Assert.Equal("Hello", workItem.Value.Data);
                    if (RandomData.GetBool(10))
                    {
                        await workItem.AbandonAsync();
                    }
                    else
                    {
                        await workItem.CompleteAsync();
                    }

                    await metrics.CounterAsync("work");

                    workItem = await queue.DequeueAsync(TimeSpan.FromMilliseconds(100));
                }
                _logger.Trace((await metrics.GetCounterStatsAsync("work")).ToString());

                var stats = await queue.GetQueueStatsAsync();

                Assert.True(stats.Dequeued >= workItemCount);
                Assert.Equal(workItemCount, stats.Completed + stats.Deadletter);
                Assert.Equal(0, stats.Queued);

                var muxer = SharedConnection.GetMuxer();
                _logger.Trace("# Keys: {0}", muxer.CountAllKeysAsync());
            }
        }
        public async Task CanDisposeCacheAndQueueAndReceiveSubscribedMessages()
        {
            var muxer       = SharedConnection.GetMuxer();
            var messageBus1 = new RedisMessageBus(new RedisMessageBusOptions {
                Subscriber = muxer.GetSubscriber(), Topic = "test-messages", LoggerFactory = Log
            });

            var cache = new RedisCacheClient(new RedisCacheClientOptions {
                ConnectionMultiplexer = muxer
            });

            Assert.NotNull(cache);

            var queue = new RedisQueue <SimpleWorkItem>(new RedisQueueOptions <SimpleWorkItem> {
                ConnectionMultiplexer = muxer,
                LoggerFactory         = Log
            });

            Assert.NotNull(queue);

            using (messageBus1) {
                using (cache) {
                    using (queue) {
                        await cache.SetAsync("test", "test", TimeSpan.FromSeconds(10));

                        await queue.DequeueAsync(new CancellationToken(true));

                        var countdown = new AsyncCountdownEvent(2);
                        await messageBus1.SubscribeAsync <SimpleMessageA>(msg => {
                            Assert.Equal("Hello", msg.Data);
                            countdown.Signal();
                        });

                        await messageBus1.PublishAsync(new SimpleMessageA { Data = "Hello" });

                        await countdown.WaitAsync(TimeSpan.FromSeconds(2));

                        Assert.Equal(1, countdown.CurrentCount);

                        cache.Dispose();
                        queue.Dispose();

                        await messageBus1.PublishAsync(new SimpleMessageA { Data = "Hello" });

                        await countdown.WaitAsync(TimeSpan.FromSeconds(2));

                        Assert.Equal(0, countdown.CurrentCount);
                    }
                }
            }
        }
        protected override IMessageBus GetMessageBus(Func <SharedMessageBusOptions, SharedMessageBusOptions> config = null)
        {
            return(new RedisMessageBus(o => {
                o.Subscriber(SharedConnection.GetMuxer().GetSubscriber());
                o.Topic("test-messages");
                o.LoggerFactory(Log);
                if (config != null)
                {
                    config(o.Target);
                }

                return o;
            }));
        }
Exemple #27
0
        public async Task CanTrimDeadletterItems()
        {
            var queue = GetQueue(retries: 0, workItemTimeout: TimeSpan.FromMilliseconds(50), deadLetterMaxItems: 3, runQueueMaintenance: false) as RedisQueue <SimpleWorkItem>;

            if (queue == null)
            {
                return;
            }

            FlushAll();
            Assert.Equal(0, CountAllKeys());

            using (queue) {
                var db          = SharedConnection.GetMuxer().GetDatabase();
                var workItemIds = new List <string>();

                for (int i = 0; i < 10; i++)
                {
                    var id = await queue.EnqueueAsync(new SimpleWorkItem { Data = "blah", Id = i });

                    Trace.WriteLine(id);
                    workItemIds.Add(id);
                }

                for (int i = 0; i < 10; i++)
                {
                    var workItem = await queue.DequeueAsync();

                    await workItem.AbandonAsync();

                    Trace.WriteLine("Abondoning: " + workItem.Id);
                }

                workItemIds.Reverse();
                await queue.DoMaintenanceWorkAsync();

                foreach (var id in workItemIds.Take(3))
                {
                    Trace.WriteLine("Checking: " + id);
                    Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id));
                }

                Assert.Equal(0, await db.ListLengthAsync("q:SimpleWorkItem:in"));
                Assert.Equal(0, await db.ListLengthAsync("q:SimpleWorkItem:work"));
                Assert.Equal(0, await db.ListLengthAsync("q:SimpleWorkItem:wait"));
                Assert.Equal(3, await db.ListLengthAsync("q:SimpleWorkItem:dead"));
                Assert.InRange(CountAllKeys(), 13, 14);
            }
        }
Exemple #28
0
        protected override IQueue <SimpleWorkItem> GetQueue(int retries = 1, TimeSpan?workItemTimeout = null, TimeSpan?retryDelay = null, int deadLetterMaxItems = 100, bool runQueueMaintenance = true)
        {
            var queue = new RedisQueue <SimpleWorkItem>(o => o
                                                        .ConnectionMultiplexer(SharedConnection.GetMuxer())
                                                        .Retries(retries)
                                                        .RetryDelay(retryDelay.GetValueOrDefault(TimeSpan.FromMinutes(1)))
                                                        .DeadLetterMaxItems(deadLetterMaxItems)
                                                        .WorkItemTimeout(workItemTimeout.GetValueOrDefault(TimeSpan.FromMinutes(5)))
                                                        .RunMaintenanceTasks(runQueueMaintenance)
                                                        .LoggerFactory(Log)
                                                        );

            _logger.LogDebug("Queue Id: {queueId}", queue.QueueId);
            return(queue);
        }
Exemple #29
0
        protected override IQueue <SimpleWorkItem> GetQueue(int retries = 1, TimeSpan?workItemTimeout = null, TimeSpan?retryDelay = null, int deadLetterMaxItems = 100, bool runQueueMaintenance = true)
        {
            var queue = new RedisQueue <SimpleWorkItem>(new RedisQueueOptions <SimpleWorkItem> {
                ConnectionMultiplexer = SharedConnection.GetMuxer(),
                Retries             = retries,
                RetryDelay          = retryDelay.GetValueOrDefault(TimeSpan.FromMinutes(1)),
                DeadLetterMaxItems  = deadLetterMaxItems,
                WorkItemTimeout     = workItemTimeout.GetValueOrDefault(TimeSpan.FromMinutes(5)),
                RunMaintenanceTasks = runQueueMaintenance,
                LoggerFactory       = Log
            });

            _logger.LogDebug("Queue Id: {queueId}", queue.QueueId);
            return(queue);
        }
Exemple #30
0
        public async Task CanTrimDeadletterItems()
        {
            var queue = GetQueue(retries: 0, workItemTimeout: TimeSpan.FromMilliseconds(50), deadLetterMaxItems: 3, runQueueMaintenance: false) as RedisQueue <SimpleWorkItem>;

            if (queue == null)
            {
                return;
            }

            using (queue) {
                var    muxer      = SharedConnection.GetMuxer();
                var    db         = muxer.GetDatabase();
                string listPrefix = muxer.IsCluster() ? "{q:SimpleWorkItem}" : "q:SimpleWorkItem";

                var workItemIds = new List <string>();
                for (int i = 0; i < 10; i++)
                {
                    string id = await queue.EnqueueAsync(new SimpleWorkItem { Data = "blah", Id = i });

                    _logger.LogTrace(id);
                    workItemIds.Add(id);
                }

                for (int i = 0; i < 10; i++)
                {
                    var workItem = await queue.DequeueAsync();

                    await workItem.AbandonAsync();

                    _logger.LogTrace("Abandoning: " + workItem.Id);
                }

                workItemIds.Reverse();
                await queue.DoMaintenanceWorkAsync();

                foreach (object id in workItemIds.Take(3))
                {
                    _logger.LogTrace("Checking: " + id);
                    Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id));
                }

                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in"));
                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work"));
                Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:wait"));
                Assert.Equal(3, await db.ListLengthAsync($"{listPrefix}:dead"));
                Assert.InRange(await muxer.CountAllKeysAsync(), 10, 11);
            }
        }
 public SQLiteConnectionManager(SharedConnection sharedConnection)
 {
     this.sharedConnection = sharedConnection;
 }
 /// <summary>
 /// Creates new SQLite Connection Manager
 /// </summary>
 public SQLiteConnectionManager(SharedConnection sharedConnection)
     : base(l => sharedConnection)
 {
 }