Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e">[0]queue name ; [1] callback method</param>
        private void bgwConsume_DoWork(object sender, DoWorkEventArgs e)
        {
            Console.WriteLine("bgwConsume_DoWork Done!");
            object[] param = (object[])e.Argument;

            var factory = new ConnectionFactory();

            //サーバー名
            factory.HostName = "godpubtest";
            //RabbitServerのユーザー名
            factory.UserName = "******";
            //RabbitServerのパスワード
            factory.Password = "******";

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    //Useage:③ 
                    //channel.ExchangeDeclare(exchange: exchangeName, type: "fanout");

                    // Temporary queues
                    var queueName = (string)param[0];

                    if (queueName.Contains("Prority"))
                    {
                        //Bindings  With Arguments
                        IDictionary <String, Object> args = new Dictionary <String, Object>();
                        args.Add("x-max-priority", 5);
                        channel.QueueDeclare(queue: queueName,
                                             durable: true,
                                             exclusive: false,
                                             autoDelete: false,
                                             arguments: args);
                    }
                    else
                    {
                        // Bindings
                        channel.QueueDeclare(queue: queueName,
                                             durable: true,
                                             exclusive: false,
                                             autoDelete: false,
                                             arguments: null);
                    }

                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (ch, ea) =>
                    {
                        var body = SerializeTool.GetBody(ea.Body);

                        IBasicProperties basicProperties = ea.BasicProperties;
                        Console.WriteLine("Message received by the event based consumer. Check the debug window for details.");
                        Debug.WriteLine("------------------------------------------------------------------");
                        Debug.WriteLine(string.Concat("Message received from the exchange ", ea.Exchange));
                        Debug.WriteLine(string.Concat("Content type: ", basicProperties.ContentType));
                        Debug.WriteLine(string.Concat("Consumer tag: ", ea.ConsumerTag));
                        Debug.WriteLine(string.Concat("Delivery tag: ", ea.DeliveryTag));
                        Debug.WriteLine(string.Concat("Message id: ", body.MsgID));
                        Debug.WriteLine(string.Concat("Message: ", body.MsgContent));

                        AddNewMessage a = (AddNewMessage)param[1];
                        this.Invoke(a, body);

                        // 如果 channel.BasicConsume 中参数 noAck 设置为 false,必须加上消息确认语句
                        // Message acknowledgment(消息确认机制作用)
                        channel.BasicAck(ea.DeliveryTag, false);
                    };

                    try
                    {
                        string consumeID = channel.BasicConsume(queue: queueName,
                                                                autoAck: false,/* Message acknowledgment(消息确认机制) */
                                                                consumer: consumer);

                        Console.WriteLine(" Consume ID={0}", consumeID);

                        while (isListening)
                        {
                            //Console.WriteLine(" Consume status={0}", consumer.IsRunning);
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("Consume Register Failure:{0}", ex.Message);
                    }
                }
            }
        }