コード例 #1
0
        private void StartConsumer()
        {
            Task.Run(() =>
            {
                using (var channel = _modelFactory.CreateModel())
                {
                    var queueName = _queueNameFactory();

                    var routingConfig = new RoutingConfig(queueName);
                    var queueConfig   = new QueueConfig(queueName, routingConfig, _exchangeConfig, false, true, true, null);

                    if (_declareQueue)
                    {
                        channel.DeclareAndBindQueue(queueConfig);
                    }

                    var consumer = new EventingBasicConsumer(channel);

                    consumer.Received += (obj, evtArgs) =>
                    {
                        var correlationId = new Guid(evtArgs.BasicProperties.CorrelationId);

                        _msgsReceived.Add(correlationId, evtArgs);
                    };

                    channel.BasicConsume(queueName, true, consumer);

                    _stopConsumer.Wait();
                }
            });

            // Allow half a second for consumer to start
            Thread.Sleep(500);
        }
コード例 #2
0
ファイル: IModelEx.cs プロジェクト: RagtimeWilly/WhiteRabbit
        public static void DeclareAndBindQueue(this IModel channel, QueueConfig queue)
        {
            channel.QueueDeclare(queue.Name, queue.Durable, queue.Exclusive, queue.AutoDelete, queue.Args);

            if (!queue.Exchange.IsDefaultExchange)
            {
                channel.DeclareExchange(queue.Exchange);

                foreach (var key in queue.RoutingConfig.RoutingKeys)
                {
                    channel.QueueBind(queue.Name, queue.Exchange.Name, key, queue.RoutingConfig.BindingArgs);
                }
            }
        }
コード例 #3
0
ファイル: IModelEx.cs プロジェクト: RagtimeWilly/WhiteRabbit
        public static void DeclareAndBindQueue(this IModel channel, QueueConfig queue)
        {
            if (!queue.Exchange.IsDefaultExchange)
            {
                channel.ExchangeDeclare(queue.Exchange.Name, queue.Exchange.ExchangeType, queue.Exchange.Durable,
                    queue.Exchange.AutoDelete, queue.Exchange.Arguments);
            }

            channel.QueueDeclare(queue.Name, queue.Durable, queue.Exclusive, queue.AutoDelete, queue.Args);

            if (!queue.Exchange.IsDefaultExchange)
            {
                channel.QueueBind(queue.Name, queue.Exchange.Name, queue.RoutingKey, queue.BindingArgs);
            }
        }
コード例 #4
0
        public Task <bool> VerifyMessageReceived <T>(Func <T, bool> verify, Guid correlationId, int millisecondsTimeout) where T : class
        {
            var t = Task.Run(() =>
            {
                var resetEvent = new ManualResetEventSlim(false);

                var verified = false;

                using (var channel = _modelFactory.CreateModel())
                {
                    var queueName = _queueNameFactory();

                    var routingConfig = new RoutingConfig(queueName);
                    var queueConfig   = new QueueConfig(queueName, routingConfig, _exchange, false, true, true, null);

                    if (_declareQueue)
                    {
                        channel.DeclareAndBindQueue(queueConfig);
                    }

                    var consumer = new EventingBasicConsumer(channel);

                    consumer.Received += (obj, evtArgs) =>
                    {
                        if (correlationId == new Guid(evtArgs.BasicProperties.CorrelationId))
                        {
                            var msg = _serializerFactory.DeserializeTo <T>(evtArgs);

                            verified = verify(msg);

                            resetEvent.Set();
                        }
                    };

                    channel.BasicConsume(queueName, true, consumer);

                    resetEvent.Wait(millisecondsTimeout);
                }

                return(verified);
            });

            // Allow half a second for consumer to start
            Thread.Sleep(500);

            return(t);
        }