WorkQueues 工作队列模式
- WorkQueues多了一个或者一些的消费端,多个消费端共同消费一个队列中的消息。
- 应用场景:对于任务过重或较多的情况使用工作队列可以提高任务处理的速度。
- 一个队列中如果有多个消费者,那么消费者之间对同一条消息的关系是竞争关系。
代码实现
生产者:生产10个消息
package com.sx.producer;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发送消息
*/
public class Producer_WorkQueues {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.1.3");
factory.setPort(5672);
factory.setVirtualHost("/sx");
factory.setUsername("sx");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("work_queues", true, false, false, null);
//发送多条消息
for (int i = 1; i <= 10; i++) {
String body = i + "_hello rabbitmq!";
channel.basicPublish("", "work_queues", null, body.getBytes());
}
channel.close();
connection.close();
}
}
消费者:2个消费者,代码相同
package com.sx.consumer;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer_WorkQueuesC1 {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.1.3");
factory.setPort(5672);
factory.setVirtualHost("/sx");
factory.setUsername("sx");
factory.setPassword("123456");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("body = " + new String(body));
}
};
channel.basicConsume("work_queues", true, consumer);
}
}
运行结果
消费者C1
消费者C2