方法~作用于对象~失败_消息三:ActiveMQ Topic 消息失败重发
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 消息失败重发相关推荐
- vb6 方法‘ ’作用于对象 失败_JS基础入门-对象的使用
今日背诵小纸条 对象是一组属性+方法的组合,其中可包含基本值.对象和函数 对象的定义 1 对象字面量 var hero{ name: '产品小姐姐', age: 16, weapon: [ '头盔', ...
- 信息记录拉取失败_个税明细申报常见失败提示信息应对方法
属期起/止"做为比对的对象,在大集中核心数据库中搜寻同一收入所属期起/止的申报历史数据. 03 问题:点击"处理出错"后,在"申报处理信息"框中包含有 ...
- phpnow 安装apache失败_装PHPnow 提示 apache 安装失败 的解决方法
今天偶在安装PHPnow_1.5.6 时总是遇到下面的提示: Syntax error on line 962 of G:/PHPnow/Apache-20/conf/httpd.conf: Cann ...
- python删除失败_对python 各种删除文件失败的处理方式分享
对python 各种删除文件失败的处理方式分享 调用python提供的各种删除文件的操作均失败 返回值5,拒绝访问,但是多次确认文件没有被打开,文件是从一个zip包中解压出来后,没有任何打开读写等操作 ...
- jira mysql 启动 失败_重启机器导致mysql启动失败
一.问题 二.常见解决方案 网上的解决方法大致为 ①空间不足(df -h 查看) ②权限不足(/var/lib文件夹)chown -R mysql:mysql /vdb1/lib/ ③修改my.cnf ...
- 自定义taglib引入失败_小程序拼团总失败?看看微信官方和开发者们怎么说
阅读时间:6m 最懂 小程序生态商业 的自媒体 可怕... 刚过国庆,南方还在短袖短裙,北方竟然都下雪了! 什么叫一天之内感受四季?晓程序观察(yinghoo-tech)的小伙伴们算是深刻体验了,穿着 ...
- python 拷贝文件创建目录失败_解决python os.mkdir创建目录失败的问题
起因 今天使用 python os.mkdir创建目录时遇到的一个小问题: feature_dir = os.path.join(os.getcwd(), 'system', 'feature') i ...
- 公众号获取token失败_微信公众号token验证失败
我用的是python3+,而官网给的例子是python2的写法.问题就在python版本不同. 下面是截取官方的实例代码的一部分 list =[token, timestamp, nonce] lis ...
- ug导出step文件失败_解决UG导出CAD图纸失败的问题
解决UG导出CAD图纸失败的问题 先说一下问题吧,有些人刚开始可以用UG在制图环境下导出CAD dwg图纸.可是后来就莫名其妙的导不出来了,那个黑色的框框跳到一半就自动不动了.而我们只得到一个XXX. ...
最新文章
- 7个步骤,帮您轻松实现云迁移
- 微控制器和微处理器的区别
- qui ajax,Ajax Fils de T Lamon
- Android与Asp.Net Web服务器的文件上传下载BUG汇总[更新]
- kotlin泛型_Kotlin泛型
- 深度图像RGB-D(RGB+Depth Map)名词扫盲笔记
- C#使用fastreport报表打印
- 怎么用python编写个apk_python写apk
- 互联网大数据面试题集锦
- 国内流行的需求管理工具比较
- Struts+Spring+Hibernate处理Lob(Blob,Clob)--sessionFactory中注入 org.springframework.jdbc.support.lob.Def
- 如何在word里里面打勾
- Agfa HealthCare releases next generation of its gold-standard
- chrome 窗体高度_控制Chrome浏览器窗口最小宽度和高度
- Revit插件推荐[二]
- Window操作系统补丁知多少?
- 程序员面试前都要做哪些准备
- 试用期程序员应该了解哪些事?如何尽快确立自己的位置?(转)
- 工控软件/PLC的信息远传的简单解决方案
- 基于android的便签app,便签app排行榜前十名安卓手机哪个高颜值便签好用?
热门文章
- JavaScript数组对象教程–如何使用JS数组方法创建,更新和遍历对象
- SpringBoot-视图解析与模板引擎
- 多线程-threading和进程VS线程(python 版)
- Python中的property类和@property装饰器
- max232管脚讲解 单片机与PC通讯
- 《深度学习》图像超分初识
- python变量名区分大小写_python变量名要不要区分大小写
- 【C++】局部变量、全局变量、静态变量与动态对象的性质
- 数值分析-拉格朗日中值定理与积分中值定理
- php写两个数相加方法_【PHP学习】实现两个n位二进制整数相加