コード例 #1
0
        public async Task Should_recreate_consumers_on_connection_recovery()
        {
            var endpoint          = GetUniqueEndpoint();
            var consumersAttached = new CountdownEvent(2);
            var testHandler       = new TestHandler(@event =>
            {
                switch (@event.Id)
                {
                case EventId.LinkRemoteOpen when @event.Context is Attach attach && !attach.Role:
                    consumersAttached.Signal();
                    break;
                }
            });

            var host1 = CreateOpenedContainerHost(endpoint, testHandler);

            var connection = await CreateConnection(endpoint);

            await connection.CreateConsumerAsync("a1", RoutingType.Anycast);

            await connection.CreateConsumerAsync("a1", RoutingType.Anycast);

            Assert.True(consumersAttached.Wait(Timeout));
            consumersAttached.Reset();

            host1.Dispose();

            var host2 = CreateOpenedContainerHost(endpoint, testHandler);

            Assert.True(consumersAttached.Wait(Timeout));

            await DisposeUtil.DisposeAll(connection, host2);
        }
コード例 #2
0
        public async Task Should_be_able_to_receive_message_when_connection_restored_after_receive_called()
        {
            var host1 = CreateOpenedContainerHost();
            var host2 = CreateContainerHost();

            var connection = await CreateConnection(new[] { host1.Endpoint, host2.Endpoint });

            var consumer = await connection.CreateConsumerAsync("a1", RoutingType.Anycast);

            var cts         = new CancellationTokenSource(Timeout);
            var receiveTask = consumer.ReceiveAsync(cts.Token);

            host2.Open();
            host1.Dispose();

            var messageSource = host2.CreateMessageSource("a1");

            messageSource.Enqueue(new Message("foo"));

            var message = await receiveTask;

            Assert.NotNull(message);
            Assert.Equal("foo", message.GetBody <string>());

            await DisposeUtil.DisposeAll(consumer, connection, host2);
        }
        public async Task Should_trigger_ConnectionRecovered_when_connection_recovered()
        {
            var host1 = CreateOpenedContainerHost();
            var host2 = CreateOpenedContainerHost();

            var connection = await CreateConnection(new[] { host1.Endpoint, host2.Endpoint });

            var      connectionRecovered = new AutoResetEvent(false);
            Endpoint fallbackEndpoint    = null;

            connection.ConnectionRecovered += (sender, args) =>
            {
                fallbackEndpoint = args.Endpoint;
                connectionRecovered.Set();
            };

            Assert.True(connection.IsOpened);

            host1.Dispose();

            Assert.True(connectionRecovered.WaitOne(Timeout));
            Assert.Equal(host2.Endpoint, fallbackEndpoint);

            await DisposeUtil.DisposeAll(connection, host2);
        }
コード例 #4
0
        public async Task Should_be_able_to_SendAsync_message_when_SendAsync_invoked_before_connection_restored()
        {
            var endpoint = GetUniqueEndpoint();

            var host1 = CreateOpenedContainerHost(endpoint);

            var connection = await CreateConnection(endpoint);

            var producer = await connection.CreateProducerAsync("a1", RoutingType.Anycast);

            await DisposeHostAndWaitUntilConnectionNotified(host1, connection);

            var cts         = new CancellationTokenSource(Timeout);
            var produceTask = producer.SendAsync(new Message("foo"), cts.Token);

            var host2            = CreateOpenedContainerHost(endpoint);
            var messageProcessor = host2.CreateMessageProcessor("a1");

            await produceTask;

            var message = messageProcessor.Dequeue(Timeout);

            Assert.NotNull(message);
            Assert.Equal("foo", message.GetBody <string>());

            await DisposeUtil.DisposeAll(connection, host2);
        }
コード例 #5
0
        public async Task Should_be_able_to_Send_message_when_Send_invoked_before_connection_restored()
        {
            var endpoint = GetUniqueEndpoint();

            var host1 = CreateOpenedContainerHost(endpoint);

            var connectionClosed = new ManualResetEvent(false);
            var connection       = await CreateConnection(endpoint);

            connection.ConnectionClosed += (_, args) => connectionClosed.Set();

            var producer = await connection.CreateProducerAsync("a1", RoutingType.Anycast);

            host1.Dispose();

            // make sure that the connection was closed, as we don't want to send a message to host1
            Assert.True(connectionClosed.WaitOne(Timeout));

            // run on another thread as we don't want to block here
            var produceTask = Task.Run(() => producer.Send(new Message("foo")));

            var host2            = CreateContainerHost(endpoint);
            var messageProcessor = host2.CreateMessageProcessor("a1");

            host2.Open();

            await produceTask;

            var message = messageProcessor.Dequeue(Timeout);

            Assert.NotNull(message);
            Assert.Equal("foo", message.GetBody <string>());

            await DisposeUtil.DisposeAll(connection, host2);
        }
        public async Task Should_reconnect_when_broker_is_available_after_outage_is_over()
        {
            var endpoint         = GetUniqueEndpoint();
            var connectionOpened = new ManualResetEvent(false);

            var testHandler = new TestHandler(@event =>
            {
                switch (@event.Id)
                {
                case EventId.ConnectionRemoteOpen:
                    connectionOpened.Set();
                    break;
                }
            });

            var host1 = CreateOpenedContainerHost(endpoint, testHandler);

            var connection = await CreateConnection(endpoint);

            Assert.NotNull(connection);
            Assert.True(connectionOpened.WaitOne(Timeout));

            host1.Dispose();

            connectionOpened.Reset();
            var host2 = CreateOpenedContainerHost(endpoint, testHandler);

            Assert.True(connectionOpened.WaitOne(Timeout));

            await DisposeUtil.DisposeAll(connection, host2);
        }
        public async Task Should_not_recreate_disposed_consumers()
        {
            var endpoint         = GetUniqueEndpoint();
            var consumerAttached = new ManualResetEvent(false);
            var testHandler      = new TestHandler(@event =>
            {
                switch (@event.Id)
                {
                case EventId.LinkRemoteOpen when @event.Context is Attach attach && !attach.Role:
                    consumerAttached.Set();
                    break;
                }
            });

            var host1 = CreateOpenedContainerHost(endpoint, testHandler);

            var connection = await CreateConnection(endpoint);

            var consumer = await connection.CreateConsumerAsync("a1", RoutingType.Anycast);

            Assert.True(consumerAttached.WaitOne(Timeout));
            await consumer.DisposeAsync();

            consumerAttached.Reset();
            host1.Dispose();

            var host2 = CreateOpenedContainerHost(endpoint, testHandler);

            Assert.False(consumerAttached.WaitOne(ShortTimeout));

            await DisposeUtil.DisposeAll(connection, host2);
        }
コード例 #8
0
        public async Task Should_be_able_to_Send_message_when_connection_restored()
        {
            var(producer, messageProcessor, host, connection) = await CreateReattachedProducer();

            producer.Send(new Message("foo"));

            var message = messageProcessor.Dequeue(Timeout);

            Assert.NotNull(message);
            Assert.Equal("foo", message.GetBody <string>());

            await DisposeUtil.DisposeAll(producer, connection, host);
        }
コード例 #9
0
        public async Task Should_be_able_to_receive_messages_when_connection_restored()
        {
            var(consumer, messageSource, host, connection) = await CreateReattachedConsumer();

            messageSource.Enqueue(new Message("foo"));

            var cts     = new CancellationTokenSource(Timeout);
            var message = await consumer.ReceiveAsync(cts.Token);

            Assert.NotNull(message);
            Assert.Equal("foo", message.GetBody <string>());

            await DisposeUtil.DisposeAll(consumer, connection, host);
        }
コード例 #10
0
        public void Dispose()
        {
            var disposeActions = new List <Action>
            {
                _reopener.Dispose,
                _committer.Dispose,
                Manager.Dispose,
                () => _writer.Dispose(true)
            };

            disposeActions.AddRange(_threads.Select(t => (Action)t.Join));

            DisposeUtil.PostponeExceptions(disposeActions.ToArray());
        }
        public async Task Should_connect_to_first_endpoint_when_auto_recovering_disabled()
        {
            var(host1, connectedToHost1) = CreateHost();
            var(host2, connectedToHost2) = CreateHost();

            var connectionFactory = CreateConnectionFactory();

            connectionFactory.AutomaticRecoveryEnabled = false;

            var connection = await connectionFactory.CreateAsync(new[] { host1.Endpoint, host2.Endpoint });

            Assert.True(connection.IsOpened);
            Assert.True(connectedToHost1.WaitOne(Timeout));
            Assert.False(connectedToHost2.WaitOne(ShortTimeout));

            await DisposeUtil.DisposeAll(connection, host1, host2);
        }
コード例 #12
0
        public async Task Should_be_able_to_receive_and_reject_messages_when_connection_restored()
        {
            var(consumer, messageSource, host, connection) = await CreateReattachedConsumer();

            messageSource.Enqueue(new Message("foo"));

            var cts     = new CancellationTokenSource(Timeout);
            var message = await consumer.ReceiveAsync(cts.Token);

            consumer.Reject(message);

            var dispositionContext = messageSource.GetNextDisposition(Timeout);

            Assert.IsType <Modified>(dispositionContext.DeliveryState);
            Assert.True(dispositionContext.Settled);

            await DisposeUtil.DisposeAll(consumer, connection, host);
        }
        public async Task Should_reconnect_to_the_second_endpoint_after_first_endpoint_disconnected()
        {
            var(host1, connectedToHost1) = CreateHost();
            var(host2, connectedToHost2) = CreateHost();

            var connection = await CreateConnection(new[] { host1.Endpoint, host2.Endpoint });

            Assert.True(connection.IsOpened);
            Assert.True(connectedToHost1.WaitOne(Timeout));
            Assert.False(connectedToHost2.WaitOne(ShortTimeout));

            host1.Dispose();

            Assert.True(connectedToHost2.WaitOne(Timeout));
            Assert.False(connectedToHost1.WaitOne(ShortTimeout));
            Assert.True(connection.IsOpened);

            await DisposeUtil.DisposeAll(connection, host2);
        }
コード例 #14
0
 public void Dispose()
 {
     DisposeUtil.DisposeFields(this);
 }
コード例 #15
0
 public ValueTask DisposeAsync()
 {
     return(DisposeUtil.DisposeAll(_receiverLink, _senderLink));
 }