
工作队列模式,一个消息只能有一个消费者消费
生产者发送20条消息
消费者有两个
第一个消费
睡一秒取一个
第二个睡2秒取


public class WorkConsumerTest1 {
public static void main(String[] args) throws IOException, TimeoutException {
//1 创建连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
//2 设置rabbitmq ip地址
connectionFactory.setHost("localhost");
//3 创建连接对象 Conection对象
Connection connection=connectionFactory.newConnection();
//4 创建管道 Chanel
Channel channel=connection.createChannel();
//5 设置队列属性
/**
* 第一个参数:队列的名称
* 第二个参数:队列是否要持久化
* 第三个参数:是否排他性(是否在同一个Connection,如果设置为true,不同的Connection是获得不到消息的)
* 第四个参数:是否自动删除消息
* 第五个参数:是否要设置一些额外的参数
*/
channel.queueDeclare("02-work",false,false,true,null);
//channel.basicQos(1);
//6 使用chanel 去 rabbitmq 获取消息进行消费
/**
* 第一个参数:队列的名称
* 第二个参数:是否自动签收
* 第三个参数:消息属性
* 第四个参数:消息内容
*/
channel.basicConsume("02-work", false,new DeliverCallback(){
/**
* 当消息从mq 中取出来了会回调这个方法
* 消费者消费消息就在这个 handle中进行处理
*/
@Override
public void handle(String s, Delivery delivery) throws IOException {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消息中的内容为:"+new String(delivery.getBody()));
//channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
}
},new CancelCallback(){
/**
* 当消息取消了会回调这个方法
*/
@Override
public void handle(String s) throws IOException {
System.out.println(111);
}
});
//7 关闭消息 注意消费者 需要持续监听,不要关闭
//channel.close();
//connection.close();
}
}

手动签收的好处:比如说你自动签收了,消息中间件上删除了,结果执行逻辑出错了
手动签收好处就是当出现异常 ,有余地可以再次执行



















