RabbitMQ

来源:互联网 发布:h3c vlan删除端口 编辑:程序博客网 时间:2024/05/19 01:33
 public static void Producer(int value)        {            try            {                var qName = "lhtest1";                var exchangeName = "fanoutchange1";                var exchangeType = "fanout";//topic、fanout                var routingKey = "*";                var uri = new Uri("amqp://192.168.10.121:5672/");                var factory = new ConnectionFactory                {                    UserName = "123",                    Password = "123",                    RequestedHeartbeat = 0,                    Endpoint = new AmqpTcpEndpoint(uri)                };                using (var connection = factory.CreateConnection())                {                    using (var channel = connection.CreateModel())                    {                        //设置交换器的类型                        channel.ExchangeDeclare(exchangeName, exchangeType);                        //声明一个队列,设置队列是否持久化,排他性,与自动删除                        channel.QueueDeclare(qName, true, false, false, null);                        //绑定消息队列,交换器,routingkey                        channel.QueueBind(qName, exchangeName, routingKey);                        var properties = channel.CreateBasicProperties();                        //队列持久化                        properties.Persistent = true;                        var m = new QMessage(DateTime.Now, value+"");                        var body = Encoding.UTF8.GetBytes(DoJson.ModelToJson<QMessage>(m));                        //发送信息                        channel.BasicPublish(exchangeName, routingKey, properties, body);                    }                }            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }        }
复制代码

消息队列的消费与消息确认Ack

1、消息队列的消费

Note:如果一个消息队列中有大量消息等待操作时,我们可以用多个客户端来处理消息,这里的分发机制是采用负载均衡算法中的轮询。第一个消息给A,下一个消息给B,下下一个消息给A,下下下一个消息给B......以此类推。

2、为啦保证消息的安全性,保证此消息被正确处理后才能在服务端的消息队列中删除。那么rabbitmq提供啦ack应答机制,来实现这一功能。

ack应答有两种方式:1、自动应答,2、手动应答。具体实现如下。

复制代码
 public static void Consumer()        {            try            {                var qName = "lhtest1";                var exchangeName = "fanoutchange1";                var exchangeType = "fanout";//topic、fanout                var routingKey = "*";                var uri = new Uri("amqp://192.168.10.121:5672/");                var factory = new ConnectionFactory                {                    UserName = "123",                    Password = "123",                    RequestedHeartbeat = 0,                    Endpoint = new AmqpTcpEndpoint(uri)                };                using (var connection = factory.CreateConnection())                {                    using (var channel = connection.CreateModel())                    {                        channel.ExchangeDeclare(exchangeName, exchangeType);                        channel.QueueDeclare(qName, true, false, false, null);                        channel.QueueBind(qName, exchangeName, routingKey);                        //定义这个队列的消费者                        QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);                        //false为手动应答,true为自动应答                        channel.BasicConsume(qName, false, consumer);                        while (true)                        {                            BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();                                                       byte[] bytes = ea.Body;                            var messageStr = Encoding.UTF8.GetString(bytes);                            var message = DoJson.JsonToModel<QMessage>(messageStr);                            Console.WriteLine("Receive a Message, DateTime:" + message.DateTime.ToString("yyyy-MM-dd HH:mm:ss") + " Title:" + message.Title);                            //如果是自动应答,下下面这句代码不用写啦。                            if ((Convert.ToInt32(message.Title) % 2) == 1)                            {                                channel.BasicAck(ea.DeliveryTag, false);                            }                        }                    }                }            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }        }
0 0
原创粉丝点击