看电影的几种情况
- 自动应答:拿票走人
- 手动应答:拿票:
- 看完,走人
- 没看,退票
- 票过期了,丢掉
开启自动应答
声明消费的阶段,第二个参数
channel.basicConsume("q", true, deliver, cancel);
手动应答API
在回调里面
看完,走人
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
//false固定的
没看,退票
channel.basicReject(message.getEnvelope().getDeliveryTag(), true);
//true表示别丢
过期,丢掉
channel.basicReject(message.getEnvelope().getDeliveryTag(), false);
//false表示丢掉
测试看完走人
DeliverCallback deliver = (consumerTag, message) -> {
Integer s = new Integer(new String(message.getBody()));
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
System.out.println(s);
};
两个消费者
没有问题
加点延迟看看
DeliverCallback deliver = (consumerTag, message) -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
Integer s = new Integer(new String(message.getBody()));
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
System.out.println(s);
};
一个没延迟,一个有延迟
可以看到,默认的轮询不受效率影响,好吧学歪了。
在看完前终止程序
终止的有点快。。。
可以看到:
- 246810是因为一开始有两个消费者
- 13579是因为另一个程序突然终止了
- 消息在意外情况会返回队列。
很安全
测试没看退票
我大于四就不收了
DeliverCallback deliver = (consumerTag, message) -> {
Integer s = new Integer(new String(message.getBody()));
if (s >= 5) {
channel.basicReject(message.getEnvelope().getDeliveryTag(), true);
System.out.println("拒绝了" + s);
} else {
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
System.out.println(s);
}
};
一个正常接收,一个拒绝大于四
可以看到,前者拒绝了579,59,9,说明被拒绝了,依旧进入了轮询
测试过期丢票
DeliverCallback deliver = (consumerTag, message) -> {
Integer s = new Integer(new String(message.getBody()));
if (s >= 5) {
channel.basicReject(message.getEnvelope().getDeliveryTag(), false);
System.out.println("拒绝了" + s);
} else {
channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
System.out.println(s);
}
};
可以看到:
- 前者拒绝了6810,并丢弃了
- 后者也没有接收到他们