3.1 JMS消息确认机制

在 Session 接口中定义的几个常量:

  • AUTO_ACKNOWLEDGE = 1 自动确认

  • CLIENT_ACKNOWLEDGE = 2 客户端手动确认

  • DUPS_OK_ACKNOWLEDGE = 3 自动批量确认

  • SESSION_TRANSACTED = 0 事务提交并确认

3.2 代码实现

消息消费端在创建 Session 对象时需要指定应答模式为客户端手动应答,当消费者获取到消息并成功处理后需要调用 message.acknowledge() 方法进行应答,通知 Broker 消费成功。

如果处理过程中出现异常,需要使用 session.recover() 通知 Broker 重复消息,默认最多重复  6 次。

  • 首先需要启动 ActiveMQ

  • 打开 IDEA,新建一个 Maven 工程

  • 在 pom.xml 文件中导入依赖的 jar

<dependency>            <groupId>org.apache.activemqgroupId>            <artifactId>activemq-clientartifactId>            <version>5.15.13version>        dependency>        <dependency>            <groupId>junitgroupId>            <artifactId>junitartifactId>            <version>4.13version>            <scope>testscope>        dependency>
  • 创建消费发送者和消息接收者

    • 消息发送者

//消息发送者    @Test    public void testProvider() throws Exception {        //创建连接工厂对象        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");        //在工厂中获取一个连接对象        Connection connection = connectionFactory.createConnection();        //连接 MQ 服务        connection.start();        //获取 Session 对象 Session.AUTO_ACKNOWLEDGE 设置为自动应答        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        //通过 Session 对象创建一个主题        Topic topic = session.createTopic("sea");        //通过 session 对象创建消息发送者        MessageProducer producer = session.createProducer(topic);        //通过  session 创建消息对象        Message message = session.createTextMessage("我的家在东北");        //发送消息        producer.send(message);        //关闭资源        producer.close();        session.close();        connection.close();    }
  • 消息接收者

//主消息接收方    @Test    public void testReceiver() throws Exception {        //创建连接工厂对象        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");        //在工厂中获取一个连接对象        Connection connection = connectionFactory.createConnection();        //连接 MQ 服务        connection.start();        //获取 Session 对象 Session.AUTO_ACKNOWLEDGE 设置为自动应答        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);        //通过 Session 对象创建一个主题        Topic topic = session.createTopic("sea");        //通过 session 对象创建消息消费者        MessageConsumer consumer = session.createConsumer(topic);        //创建消息监听器        consumer.setMessageListener(new MessageListener() {            //当监听的主题中存在消息,此时这个方法自动执行            @Override            public void onMessage(Message message) {                TextMessage textMessage = (TextMessage) message;                try {                    System.out.println("此时监听到的消息为:" + textMessage.getText());                } catch (JMSException e) {                    e.printStackTrace();                }            }        });        System.in.read();    }

我们先启动消费接收者,叫其一直处于监听状态,然后运行消息发送者:

可见此时消息发送者成功将消息发出且被接收者成功订阅,然而此时我们并没有考虑到消息被监听失败的场景,如果消息发送失败,那么我们需要重发。此时将消费端的代码改动如下:

可以进行失败次数重发的代码:

//主消息接收方    @Test    public void testReceiver() throws Exception {        //创建连接工厂对象        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");        //在工厂中获取一个连接对象        Connection connection = connectionFactory.createConnection();        //连接 MQ 服务        connection.start();        //获取 Session 对象 Session.CLIENT_ACKNOWLEDGE 设置为手动应答,避确保失败后可以进行重发        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);        //通过 Session 对象创建一个主题        Topic topic = session.createTopic("sea");        //通过 session 对象创建消息消费者        MessageConsumer consumer = session.createConsumer(topic);        //创建消息监听器        consumer.setMessageListener(new MessageListener() {            //当监听的主题中存在消息,此时这个方法自动执行            @Override            public void onMessage(Message message) {                TextMessage textMessage = (TextMessage) message;                try {                    if (textMessage.getText().equals("666")) {                        //客户端手动应答                        message.acknowledge();                    } else {                        System.out.println("消息监听失败,请重新发送~");                        session.recover();                        int i = 1 / 0;                    }                } catch (JMSException e) {                    e.printStackTrace();                }            }        });        System.in.read();    }

此时的运行结果如下:

方法~作用于对象~失败_消息三:ActiveMQ Topic 消息失败重发相关推荐

  1. vb6 方法‘ ’作用于对象 失败_JS基础入门-对象的使用

    今日背诵小纸条 对象是一组属性+方法的组合,其中可包含基本值.对象和函数 对象的定义 1 对象字面量 var hero{ name: '产品小姐姐', age: 16, weapon: [ '头盔', ...

  2. 信息记录拉取失败_个税明细申报常见失败提示信息应对方法

    属期起/止"做为比对的对象,在大集中核心数据库中搜寻同一收入所属期起/止的申报历史数据. 03 问题:点击"处理出错"后,在"申报处理信息"框中包含有 ...

  3. phpnow 安装apache失败_装PHPnow 提示 apache 安装失败 的解决方法

    今天偶在安装PHPnow_1.5.6 时总是遇到下面的提示: Syntax error on line 962 of G:/PHPnow/Apache-20/conf/httpd.conf: Cann ...

  4. python删除失败_对python 各种删除文件失败的处理方式分享

    对python 各种删除文件失败的处理方式分享 调用python提供的各种删除文件的操作均失败 返回值5,拒绝访问,但是多次确认文件没有被打开,文件是从一个zip包中解压出来后,没有任何打开读写等操作 ...

  5. jira mysql 启动 失败_重启机器导致mysql启动失败

    一.问题 二.常见解决方案 网上的解决方法大致为 ①空间不足(df -h 查看) ②权限不足(/var/lib文件夹)chown -R mysql:mysql /vdb1/lib/ ③修改my.cnf ...

  6. 自定义taglib引入失败_小程序拼团总失败?看看微信官方和开发者们怎么说

    阅读时间:6m 最懂 小程序生态商业 的自媒体 可怕... 刚过国庆,南方还在短袖短裙,北方竟然都下雪了! 什么叫一天之内感受四季?晓程序观察(yinghoo-tech)的小伙伴们算是深刻体验了,穿着 ...

  7. python 拷贝文件创建目录失败_解决python os.mkdir创建目录失败的问题

    起因 今天使用 python os.mkdir创建目录时遇到的一个小问题: feature_dir = os.path.join(os.getcwd(), 'system', 'feature') i ...

  8. 公众号获取token失败_微信公众号token验证失败

    我用的是python3+,而官网给的例子是python2的写法.问题就在python版本不同. 下面是截取官方的实例代码的一部分 list =[token, timestamp, nonce] lis ...

  9. ug导出step文件失败_解决UG导出CAD图纸失败的问题

    解决UG导出CAD图纸失败的问题 先说一下问题吧,有些人刚开始可以用UG在制图环境下导出CAD dwg图纸.可是后来就莫名其妙的导不出来了,那个黑色的框框跳到一半就自动不动了.而我们只得到一个XXX. ...

最新文章

  1. 7个步骤,帮您轻松实现云迁移
  2. 微控制器和微处理器的区别
  3. qui ajax,Ajax Fils de T Lamon
  4. Android与Asp.Net Web服务器的文件上传下载BUG汇总[更新]
  5. kotlin泛型_Kotlin泛型
  6. 深度图像RGB-D(RGB+Depth Map)名词扫盲笔记
  7. C#使用fastreport报表打印
  8. 怎么用python编写个apk_python写apk
  9. 互联网大数据面试题集锦
  10. 国内流行的需求管理工具比较
  11. Struts+Spring+Hibernate处理Lob(Blob,Clob)--sessionFactory中注入 org.springframework.jdbc.support.lob.Def
  12. 如何在word里里面打勾
  13. Agfa HealthCare releases next generation of its gold-standard
  14. chrome 窗体高度_控制Chrome浏览器窗口最小宽度和高度
  15. Revit插件推荐[二]
  16. Window操作系统补丁知多少?
  17. 程序员面试前都要做哪些准备
  18. 试用期程序员应该了解哪些事?如何尽快确立自己的位置?(转)
  19. 工控软件/PLC的信息远传的简单解决方案
  20. 基于android的便签app,便签app排行榜前十名安卓手机哪个高颜值便签好用?

热门文章

  1. JavaScript数组对象教程–如何使用JS数组方法创建,更新和遍历对象
  2. SpringBoot-视图解析与模板引擎
  3. 多线程-threading和进程VS线程(python 版)
  4. Python中的property类和@property装饰器
  5. max232管脚讲解 单片机与PC通讯
  6. 《深度学习》图像超分初识
  7. python变量名区分大小写_python变量名要不要区分大小写
  8. 【C++】局部变量、全局变量、静态变量与动态对象的性质
  9. 数值分析-拉格朗日中值定理与积分中值定理
  10. php写两个数相加方法_【PHP学习】实现两个n位二进制整数相加