Ejemplo n.º 1
0
        public async Task <RabbitConsumer> SetupChannel(string queue, bool retryOnFailure = true)
        {
            RabbitConsumer consumer = null;

            if (await EnsureConnection())
            {
                try
                {
                    _channel = _connection.CreateModel();

                    consumer = new RabbitConsumer(_channel, _queueName);

                    var queueBinding = await GetBinding(queue);

                    _channel.ExchangeDeclare(queueBinding.source, ExchangeType.Topic);

                    _channel.QueueDeclare(queue: $"Mirror{queue}", durable: true, exclusive: false, autoDelete: false, arguments: null);

                    _channel.QueueBind(queue: $"Mirror{queue}",
                                       exchange: queueBinding.source,
                                       routingKey: queueBinding.routing_key);

                    _channel.BasicQos(0, 1000, global: false);

                    _channel.BasicConsume(queue: $"Mirror{queue}", autoAck: true, consumer: consumer);

                    _channel.CallbackException += async(sender, ea) =>
                    {
                        _channel.Dispose();

                        if (retryOnFailure)
                        {
                            await SetupChannel(queue, false);
                        }
                    };
                }
                catch (Exception ex)
                {
                    throw;
                }
            }
            return(consumer);
        }
Ejemplo n.º 2
0
        private void startMq(String ageintId)
        {
            RabbitConsumer.Connect(ageintId);
            RabbitConsumer.ConsumeMessagesStart(ageintId);

            bgAgentWorker = new BackgroundWorker();


            //ReportProgress메소드를 호출하기 위해서 반드시 true로 설정, false일 경우 ReportProgress메소드를 호출하면 exception 발생
            bgAgentWorker.WorkerReportsProgress = true;

            //스레드에서 취소 지원 여부
            bgAgentWorker.WorkerSupportsCancellation = true;

            //스레드가 run시에 호출되는 핸들러 등록
            bgAgentWorker.DoWork += new DoWorkEventHandler(bw_DoWork);


            // ReportProgress메소드 호출시 호출되는 핸들러 등록
            bgAgentWorker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);


            // 스레드 완료(종료)시 호출되는 핸들러 동록
            bgAgentWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

            bgAgentWorker.RunWorkerAsync();

            /* Mq 수신 시작 알림 */
            MqSendHealthVo msVo = new MqSendHealthVo();

            msVo.agent_id     = ageintId;
            msVo.agent_status = "IDLE";
            msVo.res_typ      = "RES";
            RabbitProducer.Connect();
            RabbitProducer.MqSendMessages(ageintId, msVo.toJson());
            RabbitProducer.Disconnect();
            logger.Info("agent_id : " + msVo.agent_id + " IDLE.. ");

            startAgent.Text  = "STOP";
            this.Visible     = false;
            trayIcon.Visible = true;
        }
Ejemplo n.º 3
0
        public async Task <RabbitConsumer> InitConsumer(string queueName)
        {
            RabbitConsumer consumer = null;

            _queueName = queueName;
            if (!await EnsureConnection())
            {
                throw new Exception("Failed asablishing connection with RabbitMQ");
            }

            try
            {
                consumer = await Consume(_queueName);
            }
            catch (Exception)
            {
                throw;
            }
            return(consumer);
        }
        public void ShouldInvokeConsumer()
        {
            // GIVEN
            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>();
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute("consumerQueue"),
                null
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs();

            // WHEN
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                null,
                serviceCollection,
                logger
                );

            rabbitConsumer.RecievedEventHandler(null, eventArgs);

            // THEN
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);
        }
Ejemplo n.º 5
0
        public async Task StopConsumeAsync_Test()
        {
            var consumer = new RabbitConsumer(_connection, _serviceName, _topicName, MessageHandler,
                                              () => { }, false, 100, _options, _logger);

            await consumer.StartConsumeAsync(_cancellationTokenSource.Token);

            Assert.IsTrue(consumer.IsStarted);

            // first stop
            consumer.AbortConsume();
            A.CallTo(() => _rabbitChannel.BasicCancel(_consumerTag))
            .MustHaveHappenedOnceExactly();
            Assert.IsFalse(consumer.IsStarted);


            // does not repeat execution if stopped multiple times
            consumer.AbortConsume();
            A.CallTo(() => _rabbitChannel.BasicCancel(_consumerTag))
            .MustHaveHappenedOnceExactly();
            Assert.IsFalse(consumer.IsStarted);
        }
        public void ShouldPublishToConfiguredExchange()
        {
            // GIVEN - A consumer which will publish the returned value
            var routingKeyConfigKey   = "Config:Key:For:RoutingKey";
            var routingKeyConfigVal   = "routingKey";
            var exchangeNameConfigKey = "Config:Key:For:ExchangeName";
            var exchangeNameConfigVal = "exchangeName";
            var configDict            = new Dictionary <string, string>()
            {
                { routingKeyConfigKey, routingKeyConfigVal },
                { exchangeNameConfigKey, exchangeNameConfigVal }
            };
            var configuration = new ConfigurationBuilder()
                                .AddInMemoryCollection(configDict)
                                .Build();

            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>(new ConsumerController(returnValue: "returnValue"));
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute(
                    queueName: "consumerQueue",
                    acknowledgementType: AcknowledgementType.AutoAck,
                    nackOnException: true),
                new RabbitPublisherAttribute(
                    routingKey: "{" + routingKeyConfigKey + "}",
                    exchangeName: "{" + exchangeNameConfigKey + "}"
                    )
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs()
            {
                DeliveryTag = 99
            };

            // WHEN - The consumer consumes a message
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                configuration,
                serviceCollection,
                logger
                );

            rabbitConsumer.RecievedEventHandler(null, eventArgs);

            // THEN - Ack should be called but it will throw exception so nack will be called
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);

            mockModel.Verify(m => m.BasicConsume(
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <IDictionary <string, object> >(),
                                 It.IsAny <EventingBasicConsumer>()
                                 )
                             );
            mockModel.Verify(m => m.BasicPublish(
                                 It.Is <string>(s => s == exchangeNameConfigVal),
                                 It.Is <string>(s => s == routingKeyConfigVal),
                                 It.IsAny <bool>(),
                                 It.IsAny <IBasicProperties>(),
                                 It.IsAny <byte[]>()
                                 ));
            mockModel.VerifyNoOtherCalls();
        }
        public void ShouldNackOnInvocationException()
        {
            // GIVEN - An ack on invoke consumer, throw exception when acking
            ulong deliveryTag = 99;

            var serviceCollectionFactory = new ServiceCollection();

            // Make singleton so we can assert that the method ran
            serviceCollectionFactory.AddSingleton <ConsumerController>(new ConsumerController(throwException: true));
            //serviceCollectionFactory.AddSingleton<ConsumerController>();
            serviceCollectionFactory.AddTransient <IByteConversionService, ByteConversionService>();
            serviceCollectionFactory.AddTransient <IInvocationParameterService, InvocationParameterService>();

            var serviceCollection = serviceCollectionFactory.BuildServiceProvider();

            var consumerMethod = new ConsumerMethod(
                typeof(ConsumerController).GetMethod("Consume"),
                typeof(ConsumerController),
                new RabbitConsumerAttribute(
                    queueName: "consumerQueue",
                    acknowledgementType: AcknowledgementType.AckOnPublish,
                    nackOnException: true),
                null
                );

            var mockModel = new Mock <IModel>();
            var logger    = TestLogger.CreateXUnit <RabbitConsumer>(this.output);

            var eventArgs = new BasicDeliverEventArgs()
            {
                DeliveryTag = deliveryTag
            };

            // WHEN - The consumer consumes a message
            var rabbitConsumer = new RabbitConsumer(
                consumerMethod,
                mockModel.Object,
                null,
                serviceCollection,
                logger
                );

            Assert.Throws <TargetInvocationException>(() => {
                rabbitConsumer.RecievedEventHandler(null, eventArgs);
            });

            // THEN - Ack should be called but it will throw exception so nack will be called
            var service = serviceCollection.GetRequiredService <ConsumerController>();

            Assert.True(service.ConsumeCalled);

            mockModel.Verify(m => m.BasicConsume(
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <string>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>(),
                                 It.IsAny <IDictionary <string, object> >(),
                                 It.IsAny <EventingBasicConsumer>()
                                 )
                             );
            mockModel.Verify(m => m.BasicNack(
                                 It.Is <ulong>(l => l == deliveryTag),
                                 It.IsAny <bool>(),
                                 It.IsAny <bool>()
                                 ));
            mockModel.VerifyNoOtherCalls();
        }
Ejemplo n.º 8
0
 public void RunConsumer(string queueName)
 {
     consumer = new RabbitConsumer <string>(queueName);
     consumer.DequeueMessageDel = OnGetMessageFromGenerator;
     consumer.ProcessMessages();
 }
Ejemplo n.º 9
0
        private static void MessageStuff()
        {
            var config = new RabbitConsumerConfig()
            {
                ExchangeBindings = new List <ExchangeBinding>()
                {
                    new ExchangeBinding
                    {
                        RoutingKey   = "billing.account.create",
                        ExchangeName = "Billing"
                    },
                    new ExchangeBinding
                    {
                        RoutingKey   = "billing.account.delete",
                        ExchangeName = "Billing"
                    },
                    new ExchangeBinding
                    {
                        RoutingKey   = "policy.term.created",
                        ExchangeName = "Policy"
                    }
                },
                QueueName = "PrototypeQueue",
                HostName  = "10.0.0.190",
                UserName  = "******",
                Password  = "******",
                Port      = 5672
            };

            var account = new CreateAccount
            {
                AccountName   = "Account Name",
                Amount        = 10.20m,
                CorrelationId = "1234"
            };

            var deleteAccount = new AccountDelete()
            {
                CorrelationId = "1234",
                AccountId     = 2
            };

            var stringValue = JsonConvert.SerializeObject(deleteAccount);

            var factory = new MessageFactory(MessageMap.GetMessageMap());

            UnityContainer container = new UnityContainer();

            container.RegisterType <IMessageHandler <CreateAccount>, CreateAccountHandler>();

            var handler    = new CreateAccountHandler();
            var badHandler = new DeleteAccountHandler();
            var dispatcher = new MessageDispatcher();

            dispatcher.RegisterHandler(handler);
            dispatcher.RegisterHandler(badHandler);

            dispatcher.Register <CreateAccount>((i) =>
            {
                System.Console.WriteLine($"From Action account Name {i.AccountName}");
            });

            var consumer = new RabbitConsumer(config, factory, dispatcher);

            string value = string.Empty;

            while (value != "exit")
            {
                value = System.Console.ReadLine();
            }

            consumer.Dispose();
        }
 public static void LogRollback(
     this ISilverbackLogger logger,
     string deliveryTag,
     RabbitConsumer consumer) =>
 Rollback(logger.InnerLogger, deliveryTag, consumer.Id, consumer.Endpoint.DisplayName, null);
Ejemplo n.º 11
0
 public bool AddConnection(string clientId, RabbitConsumer consumer)
 {
     _consumers[clientId] = consumer;
     return(true);
 }
        public void DirectExchangeTest()
        {
            Dictionary <string, int> dict         = new Dictionary <string, int>(); //接收的消息数量
            Dictionary <string, int> expectedDict = new Dictionary <string, int>(); //发送的消息数量

            string[] queues      = new string[] { $"integration.{queue1}.direct", $"integration.{queue2}.direct" };
            var      routeQueues = queues.Select(f => new RouteQueue()
            {
                Arguments = null,
                Queue     = f,
                Route     = f,
                Options   = new QueueOptions()
                {
                    AutoDelete = true,
                    Durable    = true,
                    Arguments  = arguments
                }
            }).ToArray();

            //消费
            var consumer = new RabbitConsumer(hosts)
            {
                Password    = password,
                Port        = port,
                UserName    = userName,
                VirtualHost = virtualHost
            };

            foreach (var queue in queues)
            {
                dict[queue]         = 0;
                expectedDict[queue] = 0;
                consumer.Listen(direct, queue, new ExchangeConsumeQueueOptions()
                {
                    Arguments   = arguments,
                    AutoAck     = false,
                    AutoDelete  = true,
                    Durable     = true,
                    FetchCount  = 1,
                    RouteQueues = routeQueues,
                    Type        = RabbitExchangeType.Direct
                }, result =>
                {
                    Output.WriteLine($"{queue}:" + result.Body);
                    dict[queue]++;
                    result.Commit();
                });
            }

            //发布
            var producer = new RabbitProducer(hosts)
            {
                Password    = password,
                Port        = port,
                UserName    = userName,
                VirtualHost = virtualHost
            };

            for (var i = 0; i < queues.Length; i++)
            {
                var queue = queues[i];
                expectedDict[queue]++;
                producer.Publish(direct, queue, "direct" + i, new ExchangeQueueOptions()
                {
                    Arguments   = arguments,
                    AutoDelete  = true,
                    Durable     = true,
                    RouteQueues = routeQueues,
                    Type        = RabbitExchangeType.Direct
                });
            }

            BlockUntil(() => dict.Sum(f => f.Value) >= queues.Length, 3000);

            producer.Dispose();
            consumer.Dispose();

            foreach (var queue in queues)
            {
                Output.WriteLine($"{queue}:{expectedDict[queue]}-{dict[queue]}");
                Assert.Equal(expectedDict[queue], dict[queue]);
            }
        }
Ejemplo n.º 13
0
 //스레드의 run함수가 종료될 경우 해당 핸들러가 호출됩니다.
 private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
     RabbitConsumer.DisConnect();
     logger.Info(" RabbitConsumer.DisConnect ");
 }
Ejemplo n.º 14
0
 private static void Init()
 {
     Types[typeof(IProducer)] = new RabbitProducer();
     Types[typeof(IConsumer)] = new RabbitConsumer();
     isInit = true;
 }
Ejemplo n.º 15
0
 public static void LogCommit(
     this ISilverbackLogger logger,
     string deliveryTag,
     RabbitConsumer consumer) =>
 Commit(logger.InnerLogger, deliveryTag, consumer.Id, consumer.Endpoint.Name, null);