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
- rabbitmq
- RabbitMQ
- RabbitMQ
- RabbitMQ
- rabbitmq
- RabbitMQ
- RabbitMQ
- rabbitmq
- RabbitMQ
- rabbitmq
- RabbitMQ
- rabbitmq
- RabbitMQ
- rabbitmq
- RabbitMQ
- RabbitMQ
- RabbitMQ
- rabbitmq
- Java项目之画图板(一)
- linux学习笔记--ethtool命令
- 语义分析的一些方法(一)
- Android多线程 线程池
- 仿web中的form表单使用苹果原生网络请求进行文件上传
- RabbitMQ
- get与post方式的区别
- storyboard 约束出错导致textfileld位置移动,如何根据以下报错信息排查问题位置
- 充满童真、缤纷多彩的新年动态ppt模板哪里下载?
- 记自己某款App架构
- JDBC事务处理
- 汇编CMP
- C程序设计 例题6.3排序
- Linux下线程池实现