spring activeMQ 整合(三): 确认机制ACK(收到消息后,应该有一个回应也就是确认答复)

来源:互联网 发布:旅游大数据第一股 编辑:程序博客网 时间:2024/06/05 11:47

之前写的spring   activemq整合的demo   ,今天继续完善一下这个demo,让功能更强大。

Spring ActiveMQ 整合(一): 一个简单的demo,测试消息的发送与接收 

Spring ActiveMQ 整合(二): 重发机制(消息发送失败后的重新发送)


继上篇文章之后,我消息发送失败后,可以重新发送了。但是至于别人有没有收到,这就不得而而而知了。

这时候就要用到ACK确认机制了。


1.ACK机制:

      ACK (Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。

     JMS API中约定了Client端可以使用四种ACK_MODE,在javax.jms.Session接口中:

  •          AUTO_ACKNOWLEDGE = 1    自动确认
  •          CLIENT_ACKNOWLEDGE = 2    客户端手动确认   
  •          DUPS_OK_ACKNOWLEDGE = 3    自动批量确认
  •          SESSION_TRANSACTED = 0    事务提交并确认

         此外AcitveMQ补充了一个自定义的ACK_MODE:    INDIVIDUAL_ACKNOWLEDGE = 4    单条消息确认

     我们在开发JMS应用程序的时候,会经常使用到上述ACK_MODE,其中"INDIVIDUAL_ACKNOWLEDGE "只有ActiveMQ支持,当然开发者也可以使用它. ACK_MODE描述了Consumer与broker确认消息的方式(时机),比如当消息被Consumer接收之后,Consumer将在何时确认消息。对于broker而言,只有接收到ACK指令,才会认为消息被正确的接收或者处理成功了,通过ACK,可以在consumer与Broker之间建立一种简单的“担保”机制. 

   

     Client端指定了ACK_MODE,但是在Client与broker在交换ACK指令的时候,还需要告知ACK_TYPE,ACK_TYPE表示此确认指令的类型,不同的ACK_TYPE将传递着消息的状态,broker可以根据不同的ACK_TYPE对消息进行不同的操作。

 

     比如Consumer消费消息时出现异常,就需要向broker发送ACK指令,ACK_TYPE为"REDELIVERED_ACK_TYPE",那么broker就会重新发送此消息。在JMS API中并没有定义ACT_TYPE,因为它通常是一种内部机制,并不会面向开发者。ActiveMQ中定义了如下几种ACK_TYPE(参看MessageAck类):


  •          DELIVERED_ACK_TYPE = 0    消息"已接收",但尚未处理结束
  •          STANDARD_ACK_TYPE = 2    "标准"类型,通常表示为消息"处理成功",broker端可以删除消息了
  •          POSION_ACK_TYPE = 1    消息"错误",通常表示"抛弃"此消息,比如消息重发多次后,都无法正确处理时,消息将会被删除或者DLQ(死信队列)
  •          REDELIVERED_ACK_TYPE = 3    消息需"重发",比如consumer处理消息时抛出了异常,broker稍后会重新发送此消息
  •          INDIVIDUAL_ACK_TYPE = 4    表示只确认"单条消息",无论在任何ACK_MODE下    
  •          UNMATCHED_ACK_TYPE = 5    BROKER间转发消息时,接收端"拒绝"消息

    到目前为止,我们已经清楚了大概的原理: Client端在不同的ACK_MODE时,将意味着在不同的时机发送ACK指令,每个ACK Command中会包含ACK_TYPE,那么broker端就可以根据ACK_TYPE来决定此消息的后续操作. 

    上面这一段呢就是:ACK_MODE与ACK_TYPE.   想要更多的了解,有兴趣的可以自行去看看,这里由于本文的重点是怎么实现,具体原理,可以自行了解一下。

  • 2.实现消息确认:

  • 1.首先在配置文件中配置你的应答方式是什么。我这里配置的是点对点的消息确认方式。


  • [html] view plain copy
    1. <!-- 消息监听容器 消息接收监听器用于异步接收消息 -->  
    2.     <bean id="jmsContainerOne" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
    3.         <property name="connectionFactory" ref="connectionFactory" />  
    4.         <property name="destination" ref="destinationOne" />  
    5.         <property name="messageListener" ref="consumerMessageListenerOfOne" />  
    6.         <property name="sessionAcknowledgeMode" value="4"></property>
    7.     </bean>  view plain cop
  •   :给消息发送者一个回应“我收到你的消息了,你可以出队了,接受失败没有确认成功,会在原队列里面”,activemq在没有配置应答方式的时候,他是默认确认的。但是需求的各不同,就需要有不同的配置

  • 以上就完成了activemq的消息确认。


原文地址:http://blog.csdn.net/dly1580854879/article/details/68490197
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 深成指b跌光了怎么办 车贩子不办过户怎么办 荣威750v6很耗油怎么办 荣威550没电了怎么办 4s店倒闭贷款车怎么办 在单位有人整你怎么办 力帆620噪音大是怎么办 离职证明不给开怎么办 交离职报告不批怎么办 比亚迪s7噪音大怎么办 比亚迪f3噪音大怎么办 买房首付差10万怎么办 车贷合同没给我怎么办 车内老是有灰尘怎么办 车在北京怎么办进京证 五证合一后社保怎么办 五证齐全烂尾了怎么办 5万罚款交不起怎么办 炼铅环保手续要怎么办 贴膏药过敏红肿太痒了怎么办 没工作想贷款5万怎么办 燃气管超过2米了怎么办 建行燃气卡丢了怎么办 周浦燃气卡丢了怎么办 长沙燃气卡丢了怎么办 郑州燃气卡丢了怎么办 租房燃气卡丢了怎么办 洛阳燃气卡丢了怎么办 零线火线都带电怎么办 档案里年龄错了怎么办 档案年龄大了怎么办呢 吃菌子致幻了怎么办 野外吃了毒蘑菇怎么办 头顶头发稀少怎么办头顶头发稀 遇见无赖的人该怎么办 扶了老人被讹诈怎么办 遇见碰瓷讹人的怎么办 假机油用了4年怎么办 苹果6手机变砖头怎么办 苹果8升级变砖头怎么办 苹果id锁变砖头怎么办