RabbitMQ(三)消息应答

看电影的几种情况

  • 自动应答:拿票走人
  • 手动应答:拿票:
    • 看完,走人
    • 没看,退票
    • 票过期了,丢掉

开启自动应答

声明消费的阶段,第二个参数

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);
};

两个消费者
RabbitMQ(三)消息应答
没有问题

加点延迟看看

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);
};

一个没延迟,一个有延迟
RabbitMQ(三)消息应答
RabbitMQ(三)消息应答
可以看到,默认的轮询不受效率影响,好吧学歪了。

在看完前终止程序

RabbitMQ(三)消息应答
终止的有点快。。。
可以看到:

  • 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);
	}
};

一个正常接收,一个拒绝大于四
RabbitMQ(三)消息应答
RabbitMQ(三)消息应答
可以看到,前者拒绝了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);
	}
};

RabbitMQ(三)消息应答
RabbitMQ(三)消息应答
可以看到:

  1. 前者拒绝了6810,并丢弃了
  2. 后者也没有接收到他们
上一篇:RabbitMQ上手记录–part 6-Shovel


下一篇:RabbitMq-进阶-03-消息的可靠投递