zoukankan      html  css  js  c++  java
  • ActiveMQ的JMS消息可靠机制

    JMS消息可靠机制

    ActiveMQ消息签收机制:

    客戶端成功接收一条消息的标志是一条消息被签收,成功应答。

    消息的签收情形分两种:

    1、带事务的session

       如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。

    2、不带事务的session

       不带事务的session的签收方式,取决于session的配置。

       Activemq支持以下三种模式:

       Session.AUTO_ACKNOWLEDGE  消息自动签收

       Session.CLIENT_ACKNOWLEDGE  客戶端调用acknowledge方法手动签收

    textMessage.acknowledge();//手动签收

       Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息

    只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确认。 在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。

    带事务的Session:
                    生产者必须在生产完数据后手动提交session
                        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
                        。。。。。。。。
                        session.commit();

          生产者不调用commit方法消息无法到达消息队列


                    消费者在消费完数据之后也必须手动提交Session
                        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
                        。。。。。。。。
                        session.commit();
                        消费者不调用commit方法消息无法从消息队列销毁
    不带事务的Session:
                    1.自动签收(不靠谱)
                        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                    
                    2.手动签收
                        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
                        消费者必须显示调用手动签收的方法进行签收,否则队列当中还是存在数据
                        message.acknowledge();

  • 相关阅读:
    一个高级的makefile文件
    poj3616题(动态规划),看了别人的提示,自己又写了一遍
    浅谈C++ IO标准库(1)
    https证书安装踩坑
    一个简单通知服务的开发和搭建
    WCF学习笔记
    线程(Thread)、线程池(ThreadPool)技术
    BackgroundWorker与线程使用
    使用ITextSharp生成PDF文件心得
    值类型与引用类型
  • 原文地址:https://www.cnblogs.com/chx9832/p/12313527.html
Copyright © 2011-2022 走看看