首先是个人理解
一、确认应答:
可以在消费端设置自动确认应答和手动确认应答。
将第二个参数设置为true,即表示开启自动应答。
channel.basicConsume(queueName,true,deliverCallBack,cancelCallBack);
开启了自动应答之后,不管消费端有没有处理完从队列里拿到的消息,都会将队列中的消息删除掉。
将这个设置为false,就表示开启了手动应答·,只有在执行了
channel.basicAck(参数一(String类型,消息的tag),参数二(boolean类型,是否为批量应答));后,才会删除队里中的该消息。
二、确认发布
确认发布,是在生产端配置的。如果我们要将消息持久化,就需要保证三步
1、要将消息队列持久化
第二个参数设为true
channel.queueDeclare(QUEUE_NAME,true,false,false,null);
2、要将消息持久化
将第三个参数设为MessageProperties.PERSISTENT_TEXT_PLAIN
channel.basicPublish("",QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes(StandardCharsets.UTF_8));
3、确认消息发布到了队列中
同步方式:
先开启channel.confirmSelect();//默认是关闭的
如果想将消息单个确认,在每一次发送channel.basicPublish()的后面写
channel.waitForConfirms()
如果消息没有发布到队列中,线程会阻塞,直到消息发布成功或超时,才会继续执行,函数返回值为boolean,意味着如果超时,我们可以重新发送该消息到队列上。
如果想批量处理确认,就可以在多次发送channel.basicPublish()后执行
channel.waitForConfirms()。
异步发送:
先开启channel.confirmSelect();
然后开启
channel.addConfirmListener(confirmCallBack1(成功发布的回调), confirmCallBack2(未成功发布的回调));开启异步监听器监听是否发布到队列中,如果成功,将执行confirmCallBack1,未成功将执行confirmCallBack2。
其实这里我有些疑问, 为什么异步的方式返回的消息序号是有间隔的,并不是发了多少就确认回来多少,但是队列中的元素又没有少,我猜测可能是异步回调的线程被操作系统吃掉了。