生产者投放生产消息,由多个消费者消费消息。
既然是轮询,那就是消费者轮着获取消息,生产者生产多条消息,消费者依次去获取消息,每次获取一条。
代码与简单队列差距不大,区别在于消费者由一个变为多个,生产者一次性生产多条消息。
通过结果不难看出,确实是每个消费者依次获取消息,这也是默认的工作队列。
存在的问题,这种工作队列太过于理想化,并不适合实际的开发,我们难以保证每个消费者消费信息的速度相同,难免有的快有的慢,因此我们可以去人为的设置一些参数,尽量达到公平。于是也就有了公平工作队列。
生产者
package com.xxxx.work.rr.send;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;
/**
* 工作队列-轮询-生产者
*/
public class Send {
//定义队列名称
private final static String QUEUE_NAME = "work-rr";
public static void main(String[] argv) throws Exception {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//连接工厂配置
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("yeb");
factory.setPassword("yeb");
factory.setVirtualHost("/");
//创建连接
try (Connection connection = factory.newConnection();
//创建信道
Channel channel = connection.createChannel()) {
/**
* 绑定队列
* 队列名称
* 持久化
* 排他队列
* (1.基于第一次创建它的连接可见,其他的连接看不到,
* 2.其他的连接不能创建同名的排他队列
* 3.它在连接或客户端关闭的情况下会自动删除)
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
for (int i = 0; i < 20; i++) {
String message = "Hello World!"+i;
//发送消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'" +i);
}
}
}
}
消费者1
package com.xxxx.work.rr.recv;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
/**
* 工作队列-轮询-消费者
*/
public class Recv01 {
//定义队列名称
private final static String QUEUE_NAME = "work-rr";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("yeb");
factory.setPassword("yeb");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
//打印消息
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + message + "'");
};
/**
* 消费消息
* 1.队列名称
* 2.自动确认
*/
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
消费者2
package com.xxxx.work.rr.recv;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import java.nio.charset.StandardCharsets;
/**
* 工作队列-轮询-消费者
*/
public class Recv02 {
//定义队列名称
private final static String QUEUE_NAME = "work-rr";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("yeb");
factory.setPassword("yeb");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
//打印消息
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + message + "'");
};
/**
* 消费消息
* 1.队列名称
* 2.自动确认
*/
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}