开始
发送请求测试
商家收到了消息 又把消息重新发回去
也就是说这里的ack成功了
怎么看ack是成功了呢?进入我们的管控台刷新一下
刚才有1条消息没消费了。
并且这里没有未确认的消息
不手动签收,就注释这段代码
重启服务。
业务里面,业务都在正常跑。
管控台里面有一条未被签收的消息。微服务在收到这个消息,实际它都处理好了。但是因为我们开通了手工签收这个特性,代码里面我们没有去签收它,所以它一直在RabbitMQ中,看起来是没有被签收。所以它一直有一条消息在队列里。
这个时候如果我们的客户端重启了,或者微服务关闭了。先关闭微服务。
刷新页面,
这条消息从未被签收正在处理的状态,马上就回到了redy状态。相当于一个快递员去送快递,快递的接收者看了半天没签收,它如果一直在看,这个包裹就未签收的状态,他如果看了半天直接把门一关,他不说话了,不理那个快递员了。这个快递会被变成未签收状态。又拿回给快递员了。所以这条消息就又变成了ready状态。
这种重回和真正的重回队列是不一样的
下面演示下真正的重回队列。
Nack,这个方法会多一个参数,最后衣柜参数设置为true。手动的拒收。表示我们收到这条消息,我们手动的拒收,让它重回队列。
它不断的在重复一条消息。微服务直接卡死了。
因为我们收到这条消息后,进行手动的拒收。它会直接把这个消息塞回队列。问题是塞回队列后,还是当前这个微服务在监听队列。
用ack之后服务挂了再回重回ready状态。
用Nack是主动把消息踢回MQ,这样就遭到业务的死循环。
所以手动强制Nack重回队列,这里不太强制使用。
签收多条
用ack,然后是多条。
但是我们不能来一条消息就签收多条。
每发5条消息就手动签收。能被5整除。
启动服务测试。
2条没有签收的。上面测试死循环的时候有1条。刚才又发了1条。
再点击一次
变成3条
再发一条
4条
再发一条,5条的时候,会同时被签收
手动建channel
用这种类变量的形式有点low。能不能用一些高级的方法,把channel注入进来。
手动新建channel,然后把这个channel复制进来。
在这里新建connectionFactory,新建channel
通过spring注入进来。
所有的channel都是自动注入进来的
会从config里面找,它的Bean是channel
重启商家微服务 测试。连续点击5次。
一次性被签收