Example #1
0
        /// <summary>
        /// 單一程序取得Q訊息用
        /// </summary>
        /// <param name="amqpAdapter"></param>
        /// <returns></returns>
        internal override string StartDequeue(AMQPAdapter amqpAdapter)
        {
            try
            {
                var connection = (IConnection)amqpAdapter.GetConnection();

                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queueName, true, false, false, null);
                    channel.BasicQos(0, 1, false);

                    //var consumer = new QueueingBasicConsumer(channel);
                    //channel.BasicConsume(queueName, false, consumer);
                    //var messageIsAvailable = consumer.Queue.Dequeue(1 * 1000, out args);

                    var result = channel.BasicGet(queueName, false);


                    if (result != null)
                    {
                        //returnMessage = Encoding.UTF8.GetString(args.Body);
                        IBasicProperties props = result.BasicProperties;
                        byte[]           body  = result.Body;
                        returnMessage = Encoding.UTF8.GetString(body);
                        channel.BasicAck(result.DeliveryTag, false);

                        NLogService.Instance.Info($"{DateTime.Now} {channel.ChannelNumber} Info: 取得訊息。 QueueName= {queueName} Message: {returnMessage}");
                    }
                }
                return(returnMessage);
            }
            catch (TimeoutException e)
            {
                Console.WriteLine(e);
                stopConsuming = true;
                return(returnMessage);
            }
            catch (Exception e)
            {
                NLogService.Instance.Error($"{DateTime.Now}Error: TimeoutException={ e.Message} StackTrace: {e.StackTrace}");
                Console.WriteLine(e);
                //OnMessageReceived(new MessageReceivedEventArgs
                //{
                //    Exception = e
                //});
                stopConsuming = true;
                return(returnMessage);
            }
        }
Example #2
0
        /// <summary>
        /// 有輪圈功能的Consumer
        /// </summary>
        /// <param name="amqpAdapter"></param>
        internal override void Start(AMQPAdapter amqpAdapter)
        {
            try
            {
                var connection = (IConnection)amqpAdapter.GetConnection();

                using (var channel = connection.CreateModel())
                {
                    channel.ModelShutdown += Channel_ModelShutdown;

                    while (!stopConsuming)
                    {
                        if (channel.ConsumerCount(queueName) < 2 || channel.MessageCount(queueName) > 10)
                        {
                            //當Consumer少於2台,或是,Message大於10個
                            channel.QueueDeclare(queueName, true, false, false, queueArgs);
                            channel.BasicQos(0, prefetchCount, false);

                            var consumer = new EventingBasicConsumer(channel);
                            consumer.Received += OnConsumer_ReceivedII;
                            var test = channel.BasicConsume(queueName, noAck, consumer);

                            NLogService.Instance.Info($"{DateTime.Now} Info: Consumer啟動。channel: {channel.ChannelNumber}。QueueName= {queueName}。Message: {returnMessage}");
                        }
                        else
                        {
                            Thread.Sleep(3000);
                        }
                    }
                }
            }
            catch (TimeoutException e)
            {
                Console.WriteLine(e);
                stopConsuming = true;
            }
            catch (Exception exception)
            {
                OnMessageReceived(this, new MessageReceivedEventArgs
                {
                    Exception = exception
                });
                stopConsuming = true;
            }
        }
Example #3
0
        /// <summary>
        /// 背景Consumer處理服務之間的溝通
        /// </summary>
        /// <param name="amqpAdapter"></param>
        internal override void StartAsync(AMQPAdapter amqpAdapter)
        {
            try
            {
                var connection = (IConnection)amqpAdapter.GetConnection();

                using (var channel = connection.CreateModel())
                {
                    channel.ModelShutdown += Channel_ModelShutdown;

                    while (!stopConsuming)
                    {
                        if (channel.ConsumerCount(queueName) < 2 || channel.MessageCount(queueName) > 10)
                        {
                            channel.QueueDeclare(queueName, true, false, false, queueArgs);
                            channel.BasicQos(0, prefetchCount, false);

                            var consumer = new EventingBasicConsumer(channel);
                            consumer.Received += OnConsumer_ReceivedII;
                            channel.BasicConsume(queueName, noAck, consumer);
                        }
                        else
                        {
                            Thread.Sleep(3000);
                        }
                    }
                }
            }
            catch (TimeoutException e)
            {
                Console.WriteLine(e);
            }
            catch (Exception exception)
            {
                OnMessageReceived(this, new MessageReceivedEventArgs
                {
                    Exception = exception
                });
            }
        }
Example #4
0
 public Client()
 {
     _adapter = new RabbitMQAdapter();
     _adapter.Connect();
 }
Example #5
0
 /// <summary>
 /// 單一程序取得Q訊息用
 /// </summary>
 /// <param name="amqpAdapter"></param>
 /// <returns></returns>
 internal abstract string StartDequeue(AMQPAdapter amqpAdapter);
Example #6
0
 /// <summary>
 /// 背景Consumer處理服務之間的溝通
 /// </summary>
 /// <param name="amqpAdapter"></param>
 internal abstract void StartAsync(AMQPAdapter amqpAdapter);