话不多说,先直接上一个简示例代码
发送端:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct); im.QueueDeclare("rabbitmq_query", false, false, false, null); im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null); for (int i = 0; i < 1000; i++) { byte[] message = Encoding.UTF8.GetBytes("Hello Lv"); im.BasicPublish("rabbitmq_route", ExchangeType.Direct, null, message); Console.WriteLine("send:" + i); } } }
吸收端:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { while (true) { BasicGetResult res = im.BasicGet("rabbitmq_query", true); if (res != null) { Console.WriteLine("receiver:"+UTF8Encoding.UTF8.GetString(res.Body)); } } } }
发送端一次性发送一千条,发送历程很快,吸收时相对要慢一些。
上述DEMO只限一个吸收着,那雷同的发送量,多个吸收者会涌现什么情况,增加一个新的吸收端,直接复制DEMO中吸收端即可。
附上运转效果:
能够看到,在两个吸收端同时运转时,RabbitMQ 会按递次的分发每一个音讯。当每一个收到确认后,会将该音讯删除,然后将下一个分发到下一个吸收者,重要是由于RabbitMQ的轮回分发机制。
上面简朴说了一下,在多个吸收者时,由于轮回分发的缘由,音讯几乎是两个吸收端对分的。
那末怎样将雷同的音讯分发到多个吸收端。
对发送端代码举行修正:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由 int i = 0; while (true) { Thread.Sleep(1000); ++i; byte[] message = Encoding.UTF8.GetBytes(i.ToString()); im.BasicPublish("rabbitmq_route_Fanout", "", null, message); Console.WriteLine("send:" + i.ToString()); } } }
与上种体式格局比较,会发如今代码解释背面少两段代码,在设置了Fanout体式格局后,不须要再指定行列称号。停一秒是为了轻易看效果,以避免革新太快。
再来看看吸收端代码:
ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout); var queueOk = im.QueueDeclare();//1 im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2 var consumer = new QueueingBasicConsumer(im);//3 im.BasicConsume(queueOk.QueueName, true, consumer);//4 while (true) {var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5 var body = _result.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("received:{0}", message); } }
当一个新的吸收端衔接时(消费者),须要一个申报一个新的行列,解释1处代码,RabbitMQ在申报行列时,假如不指定称号会自动生成一个,这照样不错的。
两个吸收端时运转效果,相符预期。
至于播送体式格局有什么不好的地方,亲身运转下就知道了.
以上就是C#中关于RabbitMQ运用的图文代码详解 的细致内容,更多请关注ki4网别的相干文章!