- 自动应答:拿票走人
- 手动应答:拿票:
- 看完,走人
- 没看,退票
- 票过期了,丢掉
声明消费的阶段,第二个参数
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,并丢弃了
- 后者也没有接收到他们
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)