假设生产者发送 11.22.33.44.55.66.77 条消息, 我们可以指定消费者C1接受2条消息,消费者C2接受5条消息。
最后的结果是消息堆积在信道,是说堆积在信道中最多有几条
public class DirectSend {
private static final String EXCHANGE_NAME = "test_exchange_direct";
private static final String TASK_QUEUE_NAME = "task_queue_name";
private static final boolean durable = false;
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(TASK_QUEUE_NAME, durable, false, false, null);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String message = scanner.next();
//设置生产者发送消息为持久化消息(要求保存到磁盘上)保存在内存中
channel.basicPublish("", TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"));
System.out.println("生产者发出消息");
}
channel.close();
connection.close();
}
}
public class DirectRecv {
private final static String QUEUE_NAME = "test_queue_direct_1";
private final static String EXCHANGE_NAME = "test_exchange_direct";
private static final String TASK_QUEUE_NAME = "task_queue_name";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
System.out.println("c1 等待接收消息处理时间较短");
DeliverCallback deliverCallback = (consumerTag, message)->{
try {
Thread.sleep(1000L);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("接收到的消息:" + new String(message.getBody(),"UTF-8"));
//手动应答
/**
* 1、消息的标记 tag
* 2、是否批量应答 false : 不批量应答信道中的小, true:批量
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
};
// 这只不公平分发
int prefetchCount = 2;//默认是1
channel.basicQos(prefetchCount);
//采用手动应答
boolean autoAct = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAct,deliverCallback,(consumerTag -> {
System.out.println(consumerTag + "消费者消息取消接口回调逻辑");
}));
}
}
public class DirectRecv2 {
private final static String QUEUE_NAME = "test_queue_direct_1";
private final static String EXCHANGE_NAME = "test_exchange_direct";
private static final String TASK_QUEUE_NAME = "task_queue_name";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
System.out.println("c1 等待接收消息处理时间较短");
DeliverCallback deliverCallback = (consumerTag, message)->{
try {
Thread.sleep(30000L);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("接收到的消息:" + new String(message.getBody(),"UTF-8"));
//手动应答
/**
* 1、消息的标记 tag
* 2、是否批量应答 false : 不批量应答信道中的小, true:批量
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
};
// 这只不公平分发
int prefetchCount = 5;//默认是1
channel.basicQos(prefetchCount);
//采用手动应答
boolean autoAct = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAct,deliverCallback,(consumerTag -> {
System.out.println(consumerTag + "消费者消息取消接口回调逻辑");
}));
}
}
所以执行的结果,我们需要看消费者2是否消费到了5条数据