Exemple #1
0
        public async Task Should_stop_pumping_messages_after_first_unsuccessful_receive()
        {
            var successfulReceives = 46;
            var queueSize          = 1000;

            var parser = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            var inputQueue = new FakeTableBasedQueue(parser.Parse("input").QualifiedTableName, queueSize, successfulReceives);

            var pump = new MessagePump(
                m => new ProcessWithNoTransaction(sqlConnectionFactory),
                qa => qa == "input" ? (TableBasedQueue)inputQueue : new TableBasedQueue(parser.Parse(qa).QualifiedTableName, qa),
                new QueuePurger(sqlConnectionFactory),
                new ExpiredMessagesPurger(_ => sqlConnectionFactory.OpenNewConnection(), TimeSpan.MaxValue, 0),
                new QueuePeeker(sqlConnectionFactory, new QueuePeekerOptions()),
                new SchemaInspector(_ => sqlConnectionFactory.OpenNewConnection()),
                TimeSpan.MaxValue);

            await pump.Init(
                _ => Task.FromResult(0),
                _ => Task.FromResult(ErrorHandleResult.Handled),
                new CriticalError(_ => Task.FromResult(0)),
                new PushSettings("input", "error", false, TransportTransactionMode.None));

            pump.Start(new PushRuntimeSettings(1));

            await WaitUntil(() => inputQueue.NumberOfPeeks > 1);

            await pump.Stop();

            Assert.That(inputQueue.NumberOfReceives, Is.AtMost(successfulReceives + 2), "Pump should stop receives after first unsuccessful attempt.");
        }
        internal void ParseConnectionAttributes()
        {
            if (addressTranslator != null)
            {
                return;
            }

            var parser = GetConnectionStringBuilder();

            if (DefaultCatalog != null)
            {
                Catalog = DefaultCatalog;
            }
            else
            {
                if (!parser.TryGetValue("Initial Catalog", out var catalogSetting) && !parser.TryGetValue("database", out catalogSetting))
                {
                    throw new Exception("Initial Catalog property is mandatory in the connection string.");
                }
                Catalog = (string)catalogSetting;
            }

            if (parser.TryGetValue("Column Encryption Setting", out var enabled))
            {
                IsEncrypted = ((string)enabled).Equals("enabled", StringComparison.InvariantCultureIgnoreCase);
            }

            addressTranslator = new QueueAddressTranslator(Catalog, "dbo", DefaultSchema, SchemaAndCatalog);
        }
Exemple #3
0
        public async Task SetUp()
        {
            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            await ResetQueue(addressParser);

            queue = new TableBasedQueue(addressParser.Parse(QueueTableName).QualifiedTableName, QueueTableName);
        }
        static Task CreateQueueIfNotExists(QueueAddressTranslator addressTranslator)
        {
            var queueCreator  = new QueueCreator(sqlConnectionFactory, addressTranslator);
            var queueBindings = new QueueBindings();

            queueBindings.BindReceiving(QueueTableName);

            return(queueCreator.CreateQueueIfNecessary(queueBindings, ""));
        }
Exemple #5
0
        static Task CreateOutputQueueIfNecessary(QueueAddressTranslator addressParser, SqlConnectionFactory sqlConnectionFactory)
        {
            var queueCreator  = new QueueCreator(sqlConnectionFactory, addressParser, new CanonicalQueueAddress("Delayed", "dbo", "nservicebus"));
            var queueBindings = new QueueBindings();

            queueBindings.BindReceiving(validAddress);

            return(queueCreator.CreateQueueIfNecessary(queueBindings, ""));
        }
Exemple #6
0
        static Task CreateOutputQueueIfNecessary(QueueAddressTranslator addressParser)
        {
            var queueCreator  = new QueueCreator(sqlConnectionFactory, addressParser);
            var queueBindings = new QueueBindings();

            queueBindings.BindReceiving(validAddress);

            return(queueCreator.CreateQueueIfNecessary(queueBindings, ""));
        }
        static Task CreateQueueIfNotExists(QueueAddressTranslator addressTranslator, SqlConnectionFactory sqlConnectionFactory)
        {
            var queueCreator  = new QueueCreator(sqlConnectionFactory, addressTranslator, new CanonicalQueueAddress("Delayed", "dbo", "nservicebus"));
            var queueBindings = new QueueBindings();

            queueBindings.BindReceiving(QueueTableName);

            return(queueCreator.CreateQueueIfNecessary(queueBindings, ""));
        }
Exemple #8
0
        Task PurgeOutputQueue(QueueAddressTranslator addressParser)
        {
            purger = new QueuePurger(sqlConnectionFactory);
            var queueAddress = addressParser.Parse(validAddress);

            queue = new TableBasedQueue(queueAddress.QualifiedTableName, queueAddress.Address, true);

            return(purger.Purge(queue));
        }
        Task PurgeOutputQueue(QueueAddressTranslator addressParser, CancellationToken cancellationToken = default)
        {
            purger = new QueuePurger(sqlConnectionFactory);
            var queueAddress = addressParser.Parse(ValidAddress);

            queue = new TableBasedQueue(queueAddress.QualifiedTableName, queueAddress.Address, true);

            return(purger.Purge(queue, cancellationToken));
        }
        public void Should_not_change_canonical_address()
        {
            var parser = new QueueAddressTranslator(null, "dbo", null, new QueueSchemaAndCatalogOptions());

            var address          = "my.tb[e@[my.[sch@ma]@[my.c@ta]]og]";
            var canonicalAddress = parser.Parse(address).Address;

            Assert.AreEqual(address, canonicalAddress);
        }
        public void It_deduplicates_based_on_message_id_and_address(TransportOperations transportOperations, int expectedDispatchedMessageCount)
        {
            var queueAddressTranslator = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            var sortResult = transportOperations.UnicastTransportOperations.SortAndDeduplicate(queueAddressTranslator);

            Assert.AreEqual(expectedDispatchedMessageCount, sortResult.DefaultDispatch.Count());
            Assert.IsNull(sortResult.IsolatedDispatch);
        }
        /// <summary>
        /// <see cref="TransportDefinition.Initialize" />
        /// </summary>
        public override TransportInfrastructure Initialize(SettingsHolder settings, string connectionString)
        {
            settings.TryGet(SettingsKeys.DefaultSchemaSettingsKey, out string defaultSchemaOverride);
            var queueSchemaSettings = settings.GetOrDefault <QueueSchemaAndCatalogSettings>();

            var catalog       = GetDefaultCatalog(settings, connectionString);
            var addressParser = new QueueAddressTranslator(catalog, "dbo", defaultSchemaOverride, queueSchemaSettings);

            return(new SqlServerTransportInfrastructure(addressParser, settings, connectionString));
        }
Exemple #13
0
        async Task PrepareAsync()
        {
            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, new QueueSchemaAndCatalogSettings());

            await CreateOutputQueueIfNecessary(addressParser);

            await PurgeOutputQueue(addressParser);

            dispatcher = new MessageDispatcher(new TableBasedQueueDispatcher(sqlConnectionFactory, new TableBasedQueueOperationsReader(addressParser)), addressParser);
        }
        async Task PrepareAsync(CancellationToken cancellationToken = default)
        {
            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, null);
            var tableCache    = new TableBasedQueueCache(addressParser, true);

            await CreateOutputQueueIfNecessary(addressParser, sqlConnectionFactory, cancellationToken);

            await PurgeOutputQueue(addressParser, cancellationToken);

            dispatcher = new MessageDispatcher(addressParser, new NoOpMulticastToUnicastConverter(), tableCache, null, sqlConnectionFactory);
        }
        public async Task SetUp()
        {
            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            var connectionString = Environment.GetEnvironmentVariable("SqlServerTransportConnectionString") ?? @"Data Source=.\SQLEXPRESS;Initial Catalog=nservicebus;Integrated Security=True";

            sqlConnectionFactory = SqlConnectionFactory.Default(connectionString);

            await ResetQueue(addressParser, sqlConnectionFactory);

            queue = new TableBasedQueue(addressParser.Parse(QueueTableName).QualifiedTableName, QueueTableName, false);
        }
        public void It_sorts_isolated_and_default_dispatch()
        {
            var queueAddressTranslator = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            var operations = new TransportOperations(
                CreateTransportOperations("1", "dest", DispatchConsistency.Default),
                CreateTransportOperations("2", "dest", DispatchConsistency.Isolated));

            var sortResult = operations.UnicastTransportOperations.SortAndDeduplicate(queueAddressTranslator);

            Assert.AreEqual(1, sortResult.DefaultDispatch.Count());
            Assert.AreEqual(1, sortResult.IsolatedDispatch.Count());
        }
Exemple #17
0
        public async Task Should_recover(Type contextProviderType, DispatchConsistency dispatchConsistency)
        {
            // Setup

            var token = CancellationToken.None;

            var connectionString = Environment.GetEnvironmentVariable("SqlServerTransportConnectionString") ?? @"Data Source=.\SQLEXPRESS;Initial Catalog=nservicebus;Integrated Security=True";

            sqlConnectionFactory = SqlConnectionFactory.Default(connectionString);

            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, null);
            var purger        = new QueuePurger(sqlConnectionFactory);

            await RemoveQueueIfPresent(QueueName, token);
            await RemoveQueueIfPresent($"{QueueName}.Delayed", token);
            await CreateOutputQueueIfNecessary(addressParser, sqlConnectionFactory);

            var tableCache = new TableBasedQueueCache(addressParser, true);
            var queue      = tableCache.Get(QueueName);

            dispatcher = new MessageDispatcher(addressParser, new NoOpMulticastToUnicastConverter(), tableCache, null, sqlConnectionFactory);

            // Run normally
            int messagesSent = await RunTest(contextProviderType, dispatchConsistency, queue, purger, token);

            Assert.AreEqual(1, messagesSent);

            // Remove Recoverable column
            await DropRecoverableColumn(token);

            var exception = Assert.ThrowsAsync <Exception>(() => RunTest(contextProviderType, dispatchConsistency, queue, purger, token));

            Assert.True(exception.Message.Contains("change in the existence of the Recoverable column"));

            // Try again, should work
            int messagesSentAttempt2 = await RunTest(contextProviderType, dispatchConsistency, queue, purger, token);

            Assert.AreEqual(1, messagesSentAttempt2);

            // Put the Recoverable column back
            await AddRecoverableColumn(token);

            var exception2 = Assert.ThrowsAsync <Exception>(() => RunTest(contextProviderType, dispatchConsistency, queue, purger, token));

            Assert.True(exception2.Message.Contains("change in the existence of the Recoverable column"));

            // Try again, should work
            int messagesSentAttempt3 = await RunTest(contextProviderType, dispatchConsistency, queue, purger, token);

            Assert.AreEqual(1, messagesSentAttempt3);
        }
Exemple #18
0
        public async Task Should_stop_receiving_messages_after_first_unsuccessful_receive()
        {
            var successfulReceives = 46;
            var queueSize          = 1000;

            var parser = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            var inputQueueAddress = parser.Parse("input").Address;
            var inputQueue        = new FakeTableBasedQueue(inputQueueAddress, queueSize, successfulReceives);

            var connectionString = Environment.GetEnvironmentVariable("SqlServerTransportConnectionString");

            if (string.IsNullOrEmpty(connectionString))
            {
                connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=nservicebus;Integrated Security=True";
            }

            var transport = new SqlServerTransport(SqlConnectionFactory.Default(connectionString).OpenNewConnection)
            {
                TransportTransactionMode = TransportTransactionMode.None,
                TimeToWaitBeforeTriggeringCircuitBreaker = TimeSpan.MaxValue,
            };

            transport.Testing.QueueFactoryOverride = qa =>
                                                     qa == inputQueueAddress ? inputQueue : new TableBasedQueue(parser.Parse(qa).QualifiedTableName, qa, true);

            var receiveSettings = new ReceiveSettings("receiver", inputQueueAddress, true, false, "error");
            var hostSettings    = new HostSettings("IntegrationTests", string.Empty, new StartupDiagnosticEntries(),
                                                   (_, __, ___) => { },
                                                   true);

            var infrastructure = await transport.Initialize(hostSettings, new[] { receiveSettings }, new string[0]);

            var receiver = infrastructure.Receivers.First().Value;

            await receiver.Initialize(
                new PushRuntimeSettings(1),
                (_, __) => Task.CompletedTask,
                (_, __) => Task.FromResult(ErrorHandleResult.Handled));

            await receiver.StartReceive();

            await WaitUntil(() => inputQueue.NumberOfPeeks > 1);

            await receiver.StopReceive();

            await infrastructure.Shutdown();

            Assert.That(inputQueue.NumberOfReceives, Is.AtMost(successfulReceives + 2), "Receiver should stop receives after first unsuccessful attempt.");
        }
        static async Task ResetQueue(QueueAddressTranslator addressTranslator, SqlConnectionFactory sqlConnectionFactory, CancellationToken cancellationToken = default)
        {
            var queueCreator = new QueueCreator(sqlConnectionFactory, addressTranslator);

            using (var connection = await sqlConnectionFactory.OpenNewConnection(cancellationToken).ConfigureAwait(false))
            {
                using (var comm = connection.CreateCommand())
                {
                    comm.CommandText = $"IF OBJECT_ID('{QueueTableName}', 'U') IS NOT NULL DROP TABLE {QueueTableName}";
                    comm.ExecuteNonQuery();
                }
            }
            await queueCreator.CreateQueueIfNecessary(new[] { QueueTableName }, new CanonicalQueueAddress("Delayed", "dbo", "nservicebus"), cancellationToken).ConfigureAwait(false);
        }
        async Task PrepareAsync(CancellationToken cancellationToken = default)
        {
            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, new QueueSchemaAndCatalogOptions());
            var tableCache    = new TableBasedQueueCache(addressParser, true);

            var connectionString = Environment.GetEnvironmentVariable("SqlServerTransportConnectionString") ?? @"Data Source=.\SQLEXPRESS;Initial Catalog=nservicebus;Integrated Security=True";

            sqlConnectionFactory = SqlConnectionFactory.Default(connectionString);

            await CreateOutputQueueIfNecessary(addressParser, sqlConnectionFactory, cancellationToken);

            await PurgeOutputQueue(addressParser, cancellationToken);

            dispatcher = new MessageDispatcher(addressParser, new NoOpMulticastToUnicastConverter(), tableCache, null, sqlConnectionFactory);
        }
Exemple #21
0
        static async Task ResetQueue(QueueAddressTranslator addressTranslator)
        {
            var queueCreator  = new QueueCreator(sqlConnectionFactory, addressTranslator);
            var queueBindings = new QueueBindings();

            queueBindings.BindReceiving(QueueTableName);

            using (var connection = await sqlConnectionFactory.OpenNewConnection().ConfigureAwait(false))
            {
                using (var comm = connection.CreateCommand())
                {
                    comm.CommandText = $"IF OBJECT_ID('{QueueTableName}', 'U') IS NOT NULL DROP TABLE {QueueTableName}";
                    comm.ExecuteNonQuery();
                }
            }
            await queueCreator.CreateQueueIfNecessary(queueBindings, "").ConfigureAwait(false);
        }
Exemple #22
0
        async Task PrepareAsync()
        {
            var addressParser = new QueueAddressTranslator("nservicebus", "dbo", null, new QueueSchemaAndCatalogSettings());

            var connectionString = Environment.GetEnvironmentVariable("SqlServerTransportConnectionString");

            if (string.IsNullOrEmpty(connectionString))
            {
                connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=nservicebus;Integrated Security=True";
            }

            sqlConnectionFactory = SqlConnectionFactory.Default(connectionString);

            await CreateOutputQueueIfNecessary(addressParser, sqlConnectionFactory);

            await PurgeOutputQueue(addressParser);

            dispatcher = new MessageDispatcher(new TableBasedQueueDispatcher(sqlConnectionFactory, new TableBasedQueueOperationsReader(addressParser)), addressParser);
        }
        public async Task Should_stop_pumping_messages_after_first_unsuccessful_receive()
        {
            var successfulReceives = 46;
            var queueSize          = 1000;

            var parser = new QueueAddressTranslator("nservicebus", "dbo", null, null);

            var inputQueue = new FakeTableBasedQueue(parser.Parse("input").QualifiedTableName, queueSize, successfulReceives);

            var connectionString = Environment.GetEnvironmentVariable("SqlServerTransportConnectionString");

            if (string.IsNullOrEmpty(connectionString))
            {
                connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=nservicebus;Integrated Security=True";
            }

            var sqlConnectionFactory = SqlConnectionFactory.Default(connectionString);

            var pump = new MessagePump(
                m => new ProcessWithNoTransaction(sqlConnectionFactory, null),
                qa => qa == "input" ? (TableBasedQueue)inputQueue : new TableBasedQueue(parser.Parse(qa).QualifiedTableName, qa, true),
                new QueuePurger(sqlConnectionFactory),
                new NoOpExpiredMessagesPurger(),
                new QueuePeeker(sqlConnectionFactory, new QueuePeekerOptions()),
                new QueuePeekerOptions(),
                new SchemaInspector(_ => sqlConnectionFactory.OpenNewConnection(), false),
                TimeSpan.MaxValue);

            await pump.Init(
                _ => Task.FromResult(0),
                _ => Task.FromResult(ErrorHandleResult.Handled),
                new CriticalError(_ => Task.FromResult(0)),
                new PushSettings("input", "error", false, TransportTransactionMode.None));

            pump.Start(new PushRuntimeSettings(1));

            await WaitUntil(() => inputQueue.NumberOfPeeks > 1);

            await pump.Stop();

            Assert.That(inputQueue.NumberOfReceives, Is.AtMost(successfulReceives + 2), "Pump should stop receives after first unsuccessful attempt.");
        }
        static Task CreateOutputQueueIfNecessary(QueueAddressTranslator addressParser, SqlConnectionFactory sqlConnectionFactory, CancellationToken cancellationToken = default)
        {
            var queueCreator = new QueueCreator(sqlConnectionFactory, addressParser);

            return(queueCreator.CreateQueueIfNecessary(new[] { ValidAddress }, new CanonicalQueueAddress("Delayed", "dbo", "nservicebus"), cancellationToken));
        }
Exemple #25
0
        static Task CreateQueueIfNotExists(QueueAddressTranslator addressTranslator, SqlConnectionFactory sqlConnectionFactory, CancellationToken cancellationToken = default)
        {
            var queueCreator = new QueueCreator(sqlConnectionFactory, addressTranslator, false);

            return(queueCreator.CreateQueueIfNecessary(new[] { QueueTableName }, new CanonicalQueueAddress("Delayed", "dbo", "nservicebus"), cancellationToken));
        }