Пример #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="InputChannel"/> class.
 /// </summary>
 /// <param name="queueName">Name of the queue.</param>
 /// <param name="messageConsumer">The messageConsumer.</param>
 public InputChannel(string channelName, IAmAMessageConsumer messageConsumer)
 {
     _channelName     = channelName;
     _messageConsumer = messageConsumer;
     _messageConsumerSupportsDelay = _messageConsumer is IAmAMessageConsumerSupportingDelay && (_messageConsumer as IAmAMessageGatewaySupportingDelay).DelaySupported;
     _messageConsumerSupportsCache = _messageConsumer is IAmAMessageConsumerSupportingCache && (_messageConsumer as IAmAMessageGatewaySupportingCache).CacheSupported;
 }
Пример #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="InputChannel"/> class.
 /// </summary>
 /// <param name="queueName">Name of the queue.</param>
 /// <param name="messageConsumer">The messageConsumer.</param>
 public InputChannel(string channelName, IAmAMessageConsumer messageConsumer)
 {
     _channelName = channelName;
     _messageConsumer = messageConsumer;
     _messageConsumerSupportsDelay = _messageConsumer is IAmAMessageConsumerSupportingDelay && (_messageConsumer as IAmAMessageGatewaySupportingDelay).DelaySupported;
     _messageConsumerSupportsCache = _messageConsumer is IAmAMessageConsumerSupportingCache && (_messageConsumer as IAmAMessageGatewaySupportingCache).CacheSupported;
 }
Пример #3
0
        public RmqAssumeExistingInfrastructureTests()
        {
            _message = new Message(
                new MessageHeader(Guid.NewGuid(), Guid.NewGuid().ToString(), MessageType.MT_COMMAND),
                new MessageBody("test content"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange(Guid.NewGuid().ToString())
            };

            _messageProducer = new RmqMessageProducer(rmqConnection, new RmqPublication {
                MakeChannels = OnMissingChannel.Assume
            });
            _messageConsumer = new RmqMessageConsumer(
                connection: rmqConnection,
                queueName: _message.Header.Topic,
                routingKey: _message.Header.Topic,
                isDurable: false,
                highAvailability: false,
                makeChannels: OnMissingChannel.Assume);

            //This creates the infrastructure we want
            new QueueFactory(rmqConnection, _message.Header.Topic).Create(3000);
        }
Пример #4
0
      public AWSValidateInfrastructureByArnTests()
      {
          _myCommand = new MyCommand {
              Value = "Test"
          };
          Guid   correlationId = Guid.NewGuid();
          string replyTo       = "http:\\queueUrl";
          string contentType   = "text\\plain";
          var    channelName   = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45);
          string topicName     = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45);
          var    routingKey    = new RoutingKey(topicName);

          SqsSubscription <MyCommand> subscription = new(
              name : new SubscriptionName(channelName),
              channelName : new ChannelName(channelName),
              routingKey : routingKey,
              makeChannels : OnMissingChannel.Create
              );

          _message = new Message(
              new MessageHeader(_myCommand.Id, topicName, MessageType.MT_COMMAND, correlationId, replyTo, contentType),
              new MessageBody(JsonSerializer.Serialize((object)_myCommand, JsonSerialisationOptions.Options))
              );


          (AWSCredentials credentials, RegionEndpoint region) = CredentialsChain.GetAwsCredentials();
          var awsConnection = new AWSMessagingGatewayConnection(credentials, region);

          //We need to do this manually in a test - will create the channel from subscriber parameters
          //This doesn't look that different from our create tests - this is because we create using the channel factory in
          //our AWS transport, not the consumer (as it's a more likely to use infrastructure declared elsewhere)
          _channelFactory = new ChannelFactory(awsConnection);
          var channel = _channelFactory.CreateChannel(subscription);

          var topicArn      = FindTopicArn(credentials, region, routingKey.Value);
          var routingKeyArn = new RoutingKey(topicArn);

          //Now change the subscription to validate, just check what we made
          subscription = new(
              name : new SubscriptionName(channelName),
              channelName : channel.Name,
              routingKey : routingKeyArn,
              findTopicBy : TopicFindBy.Arn,
              makeChannels : OnMissingChannel.Validate
              );

          _messageProducer = new SqsMessageProducer(
              awsConnection,
              new SqsPublication
            {
                TopicArns = new Dictionary <string, string>()
                {
                    { topicName, topicArn }
                },
                FindTopicBy  = TopicFindBy.Arn,
                MakeChannels = OnMissingChannel.Validate
            });

          _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription);
      }
Пример #5
0
        public RmqMessageProducerTTLTests()
        {
            _messageOne = new Message(
                new MessageHeader(Guid.NewGuid(), Guid.NewGuid().ToString(), MessageType.MT_COMMAND),
                new MessageBody("test content"));

            _messageTwo = new Message(
                new MessageHeader(Guid.NewGuid(), Guid.NewGuid().ToString(), MessageType.MT_COMMAND),
                new MessageBody("test content"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange"),
            };

            _messageProducer = new RmqMessageProducer(rmqConnection);

            _messageConsumer = new RmqMessageConsumer(
                connection: rmqConnection,
                queueName: _messageOne.Header.Topic,
                routingKey: _messageOne.Header.Topic,
                isDurable: false,
                highAvailability: false,
                ttl: 10000,
                makeChannels: OnMissingChannel.Create
                );

            //create the infrastructure
            _messageConsumer.Receive(0);
        }
        public void When_a_message_is_sent_keep_order()
        {
            IAmAMessageConsumer consumer = _consumer;

            try
            {
                //Send a sequence of messages to Kafka
                var msgId  = SendMessage();
                var msgId2 = SendMessage();
                var msgId3 = SendMessage();
                var msgId4 = SendMessage();

                //Now read those messages in order

                var firstMessage = ConsumeMessages(consumer);
                var message      = firstMessage.First();
                message.Id.Should().Be(msgId);

                var secondMessage = ConsumeMessages(consumer);
                message = secondMessage.First();
                message.Id.Should().Be(msgId2);

                var thirdMessages = ConsumeMessages(consumer);
                message = thirdMessages.First();
                message.Id.Should().Be(msgId3);

                var fourthMessage = ConsumeMessages(consumer);
                message = fourthMessage.First();
                message.Id.Should().Be(msgId4);
            }
            finally
            {
                consumer?.Dispose();
            }
        }
Пример #7
0
        private IEnumerable <Message> ConsumeMessages(IAmAMessageConsumer consumer)
        {
            var messages = new Message[0];
            int maxTries = 0;

            do
            {
                try
                {
                    maxTries++;
                    Task.Delay(500).Wait(); //Let topic propogate in the broker
                    messages = consumer.Receive(1000);

                    if (messages[0].Header.MessageType != MessageType.MT_NONE)
                    {
                        break;
                    }
                }
                catch (ChannelFailureException cfx)
                {
                    //Lots of reasons to be here as Kafka propogates a topic, or the test cluster is still initializing
                    _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}");
                }
            } while (maxTries <= 3);

            return(messages);
        }
Пример #8
0
        public void When_queue_is_Purged()
        {
            IAmAMessageConsumer consumer = _consumer;

            try
            {
                //Send a sequence of messages to Kafka
                var msgId  = SendMessage();
                var msgId2 = SendMessage();
                var msgId3 = SendMessage();
                var msgId4 = SendMessage();

                //Now read those messages in order

                var firstMessage = ConsumeMessages(consumer);
                var message      = firstMessage.First();
                message.Id.Should().Be(msgId);

                _consumer.Purge();

                //Next Message should not exists (default will be returned)

                var nextMessage = ConsumeMessages(consumer);
                message = nextMessage.First();

                Assert.Equal(new Message(), message);
            }
            finally
            {
                consumer?.Dispose();
            }
        }
Пример #9
0
        public ChannelRequeueWithoutDelayTest()
        {
            _gateway = A.Fake <IAmAMessageConsumer>();

            _channel = new Channel("test", _gateway);

            _requeueMessage = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("a test body"));
        }
Пример #10
0
 public RestMsMessageProducerSendTests()
 {
     var configuration = new RestMSMessagingGatewayConfiguration
     {
         Feed = new Feed { Name = "test", Type = "Default"},
         RestMS = new RestMsSpecification { Uri = new Uri("http://localhost:3416/restms/domain/default"),  Id = "dh37fgj492je", User ="******", Key ="wBgvhp1lZTr4Tb6K6+5OQa1bL9fxK7j8wBsepjqVNiQ=", Timeout=2000}
     };
     _messageProducer = new RestMsMessageProducer(configuration);
     _messageConsumer = new RestMsMessageConsumer(configuration, QueueName, Topic);
     _message = new Message(new MessageHeader(Guid.NewGuid(), Topic, MessageType.MT_COMMAND), new MessageBody("test content"));
 }
Пример #11
0
        public PurgeTest()
        {
            var testHelper = new MsSqlTestHelper();

            testHelper.SetupQueueDb();

            var sub = new Subscription <MyCommand>(new SubscriptionName(_queueName),
                                                   new ChannelName(_topic), new RoutingKey(_topic));

            _producer = new MsSqlMessageProducerFactory(testHelper.QueueConfiguration).Create();
            _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).Create(sub);
        }
        public ChannelMessageReceiveTests()
        {
            _gateway = A.Fake <IAmAMessageConsumer>();

            _channel = new Channel("test", _gateway);

            _sentMessage = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("a test body"));

            A.CallTo(() => _gateway.Receive(1000)).Returns(_sentMessage);
        }
        public ChannelAcknowledgeTests()
        {
            _gateway = A.Fake <IAmAMessageConsumer>();

            _channel = new  Channel("test", _gateway);

            _receivedMessage = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("a test body"));

            _receivedMessage.DeliveryTag = 12345UL;
        }
Пример #14
0
        public void Establish()
        {
            _gateway = A.Fake <IAmAMessageConsumer>();

            _channel = new Channel("test", _gateway);

            _receivedMessage = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("a test body"));

            _receivedMessage.SetDeliveryTag(12345UL);
        }
Пример #15
0
        public void Establish()
        {
            _gateway = A.Fake <IAmAMessageConsumer>();

            _channel = new Channel("test", _gateway);

            _requeueMessage = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("a test body"));

            _stopWatch = new Stopwatch();
        }
        public ChannelRequeueWithUsnpportedDelayTests()
        {
            _consumer = A.Fake <IAmAMessageConsumer>();

            _channel = new Channel("test", _consumer);

            _requeueMessage = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("a test body"));

            _stopWatch = new Stopwatch();
        }
Пример #17
0
        public SqsMessageProducerRequeueTests()
        {
            var messageHeader = new MessageHeader(Guid.NewGuid(), "TestSqsTopic", MessageType.MT_COMMAND);

            messageHeader.UpdateHandledCount();
            _sentMessage = new Message(messageHeader, new MessageBody("test content"));

            var credentials = new AnonymousAWSCredentials();

            _sender            = new SqsMessageProducer(credentials);
            _receiver          = new SqsMessageConsumer(credentials, _queueUrl);
            _testQueueListener = new TestAWSQueueListener(credentials, _queueUrl);
        }
Пример #18
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="Channel" /> class.
        /// </summary>
        /// <param name="channelName">Name of the queue.</param>
        /// <param name="messageConsumer">The messageConsumer.</param>
        /// <param name="maxQueueLength">What is the maximum buffer size we will accelt</param>
        public Channel(string channelName, IAmAMessageConsumer messageConsumer, int maxQueueLength = 1)
        {
            _channelName     = channelName;
            _messageConsumer = messageConsumer;

            if (maxQueueLength < 1 || maxQueueLength > 10)
            {
                throw new ConfigurationException(
                          "The channel buffer must have one item, and cannot have more than 10");
            }

            _maxQueueLength = maxQueueLength;
        }
Пример #19
0
        public RMQBufferedConsumerTests()
        {
            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange")
            };

            _messageProducer = new RmqMessageProducer(rmqConnection);
            _messageConsumer = new RmqMessageConsumer(rmqConnection, _topic, _topic, false, false, BatchSize);

            //create the queue, so that we can receive messages posted to it
            new QueueFactory(rmqConnection, _topic).Create(3000);
        }
Пример #20
0
        public BufferedChannelTests()
        {
            _gateway = A.Fake <IAmAMessageConsumer>();

            _channel = new Channel("test", _gateway, BufferLimit);

            _messageOne = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("FirstMessage"));

            _messageTwo = new Message(
                new MessageHeader(Guid.NewGuid(), "key", MessageType.MT_EVENT),
                new MessageBody("SecondMessage"));
        }
        public RmqMessageProducerSendMessageTests()
        {
            _message = new Message(new MessageHeader(Guid.NewGuid(), "test1", MessageType.MT_COMMAND), new MessageBody("test content"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange")
            };

            _messageProducer = new RmqMessageProducer(rmqConnection);
            _messageConsumer = new RmqMessageConsumer(rmqConnection, _message.Header.Topic, _message.Header.Topic, false, 1, false);
            _messageConsumer.Purge();

            _client = new TestRMQListener(rmqConnection, _message.Header.Topic);
        }
Пример #22
0
        public RmqMessageProducerSendMessageTests()
        {
            _message = new Message(
                new MessageHeader(Guid.NewGuid(), Guid.NewGuid().ToString(), MessageType.MT_COMMAND),
                new MessageBody("test content"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange")
            };

            _messageProducer = new RmqMessageProducer(rmqConnection);
            _messageConsumer = new RmqMessageConsumer(rmqConnection, _message.Header.Topic, _message.Header.Topic, false, false);

            new QueueFactory(rmqConnection, _message.Header.Topic).Create(3000);
        }
        public void Establish()
        {
            var messageHeader = new MessageHeader(Guid.NewGuid(), "TestSqsTopic", MessageType.MT_COMMAND);

            messageHeader.UpdateHandledCount();
            _message = new Message(header: messageHeader, body: new MessageBody("test content"));

            var credentials = new AnonymousAWSCredentials();

            _sender            = new SqsMessageProducer(credentials);
            _receiver          = new SqsMessageConsumer(credentials, _queueUrl);
            _testQueueListener = new TestAWSQueueListener(credentials, _queueUrl);

            _sender.Send(_message);

            _listenedMessage = _receiver.Receive(1000);
        }
        public OrderTest()
        {
            var testHelper = new MsSqlTestHelper();

            testHelper.SetupQueueDb();

            var sub = new Subscription <MyCommand>(new SubscriptionName(_queueName),
                                                   new ChannelName(_topic), new RoutingKey(_topic));

            _producerRegistry = new MsSqlProducerRegistryFactory(
                testHelper.QueueConfiguration,
                new Publication[] { new Publication()
                                    {
                                        Topic = new RoutingKey(_topic)
                                    } }
                ).Create();
            _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).Create(sub);
        }
Пример #25
0
        public RmqMessageConsumerMultipleTopicTests()
        {
            _messageTopic1 = new Message(new MessageHeader(Guid.NewGuid(), "test1", MessageType.MT_COMMAND), new MessageBody("test content for topic test 1"));
            _messageTopic2 = new Message(new MessageHeader(Guid.NewGuid(), "test2", MessageType.MT_COMMAND), new MessageBody("test content for topic test 2"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange")
            };

            var topics = new[] { _messageTopic1.Header.Topic, _messageTopic2.Header.Topic };

            _messageProducer = new RmqMessageProducer(rmqConnection);
            _messageConsumer = new RmqMessageConsumer(rmqConnection, "Multiple.Topic.Queue", topics, false, 1, false);
            _messageConsumer.Purge();

            _client = new TestRMQListener(rmqConnection, "Multiple.Topic.Queue", topics);
        }
        private Message[] ConsumeMessages(string groupId, int batchLimit)
        {
            var consumedMessages = new List <Message>();

            using (IAmAMessageConsumer consumer = CreateConsumer(groupId))
            {
                for (int i = 0; i < batchLimit; i++)
                {
                    consumedMessages.Add(ConsumeMessage(consumer));
                }
            }

            return(consumedMessages.ToArray());

            Message ConsumeMessage(IAmAMessageConsumer consumer)
            {
                Message[] messages = new [] { new Message() };
                int       maxTries = 0;

                do
                {
                    try
                    {
                        maxTries++;
                        Task.Delay(500).Wait(); //Let topic propogate in the broker
                        messages = consumer.Receive(1000);

                        if (messages[0].Header.MessageType != MessageType.MT_NONE)
                        {
                            consumer.Acknowledge(messages[0]);
                            return(messages[0]);
                        }
                    }
                    catch (ChannelFailureException cfx)
                    {
                        //Lots of reasons to be here as Kafka propogates a topic, or the test cluster is still initializing
                        _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}");
                    }
                } while (maxTries <= 3);

                return(messages[0]);
            }
        }
        public RmqMessageConsumerOperationInterruptedTests()
        {
            var messageHeader = new MessageHeader(Guid.NewGuid(), Guid.NewGuid().ToString(), MessageType.MT_COMMAND);

            messageHeader.UpdateHandledCount();
            _sentMessage = new Message(messageHeader, new MessageBody("test content"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange")
            };

            _sender      = new RmqMessageProducer(rmqConnection);
            _receiver    = new RmqMessageConsumer(rmqConnection, _sentMessage.Header.Topic, _sentMessage.Header.Topic, false, false);
            _badReceiver = new OperationInterruptedRmqMessageConsumer(rmqConnection, _sentMessage.Header.Topic, _sentMessage.Header.Topic, false, 1, false);

            _sender.Send(_sentMessage);
        }
Пример #28
0
        public void Establish()
        {
            var messageHeader = new MessageHeader(Guid.NewGuid(), "test2", MessageType.MT_COMMAND);

            messageHeader.UpdateHandledCount();
            _sentMessage = new Message(header: messageHeader, body: new MessageBody("test content"));

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.brighter.exchange")
            };

            _sender      = new RmqMessageProducer(rmqConnection);
            _receiver    = new RmqMessageConsumer(rmqConnection, _sentMessage.Header.Topic, _sentMessage.Header.Topic, false, 1, false);
            _badReceiver = new NotSupportedRmqMessageConsumer(rmqConnection, _sentMessage.Header.Topic, _sentMessage.Header.Topic, false, 1, false);

            _receiver.Purge();
            _sender.Send(_sentMessage);
        }
        public IAmAChannel CreateChannel(Subscription subscription)
        {
            if (!(subscription is AzureServiceBusSubscription azureServiceBusSubscription))
            {
                throw new ConfigurationException("We expect an AzureServiceBusSubscription or AzureServiceBusSubscription<T> as a parameter");
            }

            if (subscription.TimeoutInMiliseconds < 400)
            {
                throw new ArgumentException("The minimum allowed timeout is 400 milliseconds");
            }

            IAmAMessageConsumer messageConsumer = _azureServiceBusConsumerFactory.Create(azureServiceBusSubscription);

            return(new Channel(
                       channelName: subscription.ChannelName,
                       messageConsumer: messageConsumer,
                       maxQueueLength: subscription.BufferSize
                       ));
        }
        public KafkaMessageProducerSendTests(ITestOutputHelper output)
        {
            _output   = output;
            _producer = new KafkaMessageProducerFactory(
                new KafkaMessagingGatewayConfiguration
            {
                Name             = "Kafka Producer Send Test",
                BootStrapServers = new[] { "localhost:9092" }
            }).Create();

            _consumer = new KafkaMessageConsumerFactory(
                new KafkaMessagingGatewayConfiguration
            {
                Name             = "Kafka Consumer Test",
                BootStrapServers = new[] { "localhost:9092" }
            }).Create(new Connection <MyCommand>(
                          channelName: new ChannelName(_queueName),
                          routingKey: new RoutingKey(_topic)
                          )
                      );
        }
Пример #31
0
        public RmqMessageProducerDelayedMessageTests()
        {
            var header          = new MessageHeader(Guid.NewGuid(), Guid.NewGuid().ToString(), MessageType.MT_COMMAND);
            var originalMessage = new Message(header, new MessageBody("test3 content"));

            var mutatedHeader = new MessageHeader(header.Id, Guid.NewGuid().ToString(), MessageType.MT_COMMAND);

            mutatedHeader.Bag.Add(HeaderNames.DELAY_MILLISECONDS, 1000);
            _message = new Message(mutatedHeader, originalMessage.Body);

            var rmqConnection = new RmqMessagingGatewayConnection
            {
                AmpqUri  = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")),
                Exchange = new Exchange("paramore.delay.brighter.exchange", supportDelay: true)
            };

            _messageProducer = new RmqMessageProducer(rmqConnection);
            _messageConsumer = new RmqMessageConsumer(rmqConnection, _message.Header.Topic, _message.Header.Topic, false, false);

            new QueueFactory(rmqConnection, _message.Header.Topic).Create(3000);
        }