一、工作队列介绍
- Work queues:比简单模式多了一个或者多个消费者,多个消费者消费同一个队列中的消息
- 应用场景:对于任务过重或者过多的情况下,可以提高任务处理的速度
二、示例
基础代码及工具类全都在第一篇中,需要请查看《RabbitMQ工作模式(一)》
1、生产者代码
packagecom.cui.producer; importcom.cui.common.RabbitMqUtils; importcom.rabbitmq.client.Channel; importcom.rabbitmq.client.Connection; importjava.io.IOException; /*** 工作队列生产者*/publicclassProducer_WorkQueues { publicstaticvoidmain(String[] args) throwsIOException { //获得连接Connectionconnection=RabbitMqUtils.getConnection(); //创建channelChannelchannel=connection.createChannel(); //创建队列channel.queueDeclare("work_queues", true, false, false, null); //发送消息for (inti=0; i<10; i++) { Stringbody="hello_Word"+i; channel.basicPublish("", "work_queues", null, body.getBytes()); } //释放资源RabbitMqUtils.close(channel, connection); } }
2、消费者代码
packagecom.cui.consumer; importcom.cui.common.RabbitMqUtils; importcom.rabbitmq.client.*; importjava.io.IOException; /*** 工作队列消费者Consumer_WorkQueues1,可复制一份同样的代码充当消费者2*/publicclassConsumer_WorkQueues1 { publicstaticvoidmain(String[] args) throwsIOException { Connectionconnection=RabbitMqUtils.getConnection(); Channelchannel=connection.createChannel(); channel.queueDeclare("work_queues", true, false, false, null); //接收消息Consumerconsumer=newDefaultConsumer(channel){ publicvoidhandleDelivery(StringconsumerTag, Envelopeenvelope, AMQP.BasicPropertiesproperties, byte[] body) throwsIOException { Stringmessage=newString(body, "UTF-8"); System.out.println("接收到消息:"+message); } }; channel.basicConsume("work_queues", true, consumer); } }
3、小结:
- 多个消费者之间对于同一个消息是竞争关系
- WorkQueues是对于任务过重或者过多的情况可以提高任务处理的速度,例如:短信服务部署多个,只要有一个节点发送成功即可。