其他分享
首页 > 其他分享> > RabbitMQ(三)消息应答

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

两个消费者
在这里插入图片描述
没有问题

加点延迟看看

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

一个没延迟,一个有延迟
在这里插入图片描述
在这里插入图片描述
可以看到,默认的轮询不受效率影响,好吧学歪了。

在看完前终止程序

在这里插入图片描述
终止的有点快。。。
可以看到:

很安全

测试没看退票

我大于四就不收了

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

在这里插入图片描述
在这里插入图片描述
可以看到:

  1. 前者拒绝了6810,并丢弃了
  2. 后者也没有接收到他们

标签:getDeliveryTag,false,应答,getEnvelope,RabbitMQ,消息,new,message,channel
来源: https://blog.csdn.net/qq_37284843/article/details/122286846