ChannelAwareMessageListener 与MessageListener
来源:互联网 发布:reshade画面优化补丁 编辑:程序博客网 时间:2024/05/21 14:54
在使用Spring amqp创建消费者并接收消息时,通常会用到下面两个接口。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
我们会实现接口,并通过onMessage方法来接收消息。在接收消息后,处理业务时如果出现异常,那么消费者会不断接收到重发的消息。有时候在出现某些异常,无法处理,因此并不希望继续接收到重发,因此需要用到手工确认模式,来按需进行重发。
1.默认情况下为什么会自动重发?
在配置消费端时,通常使用下面的配置。而对于rabbit:listener-container标签并未指定“确认属性” acknowledge。默认情况下该属性为auto。
- 1
- 2
- 3
- 4
当onMessage方法产生异常后,框架会调用下面的方法处理异常。
- 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
isAutoAck方法
- 1
- 2
- 3
可以看到,如果acknowledge即非manul,也非none时(调用处方法名字是isAutoAck,但内部确实判断是否为NONE),那么会调用this.channel.basicReject。因此发送否定确认,最终不断收到重复发送的消息。
关于否认可以参考下面的链接。
http://www.rabbitmq.com/nack.html
2.对消息进行手工确认
为了在Spring-amqp框架中进行手工确认,在接收消息时需要实现如下的接口。
- 1
- 2
- 3
- 4
此外消费者的确认模式需要配置为manual,其中确认模式包括NONE,MANUL,与AUTO三种[1]。
- 1
- 2
那么当收到消息后,如果要否认,或确认则通过调用channel对象的下面的两个方法即可。其中basicAck进行确认,而basicNack进行否认。
- 1
- 2
- 3
- 4
上面代码中deliveryTag即消息消交付的一个标识,其作用域为channel。而basicNAck与basicReject都可以进行否则,二者区别参考下面的官网解释。
http://www.rabbitmq.com/nack.html
当在onMessage方法中调用basicAck确认消息后,队列中持久化的消息会被删除。而调用basicNack后,会收到rabbitmq重发的消息。若未调用basicAck确认则消息会产生堆积[2]。那么当消费者下再一次连接rabbitmq时消息会重发给消费者。
[1]Spring-amqp 配置消息的三种确认方式,http://docs.spring.io/spring-amqp/docs/1.6.5.RELEASE/reference/html/_reference.html 3.1.15 Message Listener Container Configuration
[2]消息确认 http://www.rabbitmq.com/tutorials/tutorial-two-java.html Forgotten acknowledgment
- ChannelAwareMessageListener 与MessageListener
- ActiveMQ入门教程(六) - ActiveMQ与Spring整合-MessageListener
- jms:MessageListener
- MessageListener 类
- android wear开发之MessageApi.MessageListener的注册与移除
- (三):MessageListener
- ActiveMQ(三):消息监听器 MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- 深入掌握JMS(三):MessageListener
- MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?
- 如何让 Qt 的程序使用 Sleep
- Boost.Asio技术文档汇总
- 关于Android中常用的四种线程池的介绍
- 路漫漫兮,吾将上下而求索
- ChannelAwareMessageListener 与MessageListener
- windows下用cmd切换目录
- 喂,你是在学习还是在逃避?
- Intellij IDEA使用(八)—— 解决Intellij IDEA导入Eclipse项目出现的中文注释乱码问题
- 坚持#第241天~shell脚本3
- linux安装JDK
- 并发模型的生产者消费者模型
- 专注创作,用技术表现艺术
- ArrayList扩容机制