我们在创建session的时候,往往有两个参数要填,第一个为事务transation参数(true/false),true表示使用事务,false表示不使用事务,第二个参数为接收,后面再讲,先学习事务基本用法,即参数使用true,这时,当我们发送完数据,需要释放资源时,在session资源释放之前需要commit提交事务,否则发送的数据服务器不予响应,消费者端同理,消费完消息之后也需要在session关闭前commit提交事务,否则消费者会重复消费数据。

生产者:

ActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory(ACTIVEMQ_URL);//create connect and startConnection connection=activeMQConnectionFactory.createConnection();connection.start();//create sessionSession session = connection.createSession(true, AUTO_ACKNOWLEDGE);//create 目的地Queue queue=session.createQueue(Queuep);//create producerMessageProducer messageProducer=session.createProducer(queue);
//        messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);//send massegefor(int i=0;i<6;i++){//create messageTextMessage textMessage=session.createTextMessage("message---"+i);messageProducer.send(textMessage);textMessage.setStringProperty("kehu","vip");}messageProducer.close();session.commit();session.close();connection.close();System.out.println("消息发送完毕");

这里代码不全,和之前的一样的,只是改了一点点内容。这里我们不妨测试一下,将session.commit()注释掉,执行代码向服务器发送消息,会出现:

会发现有名为queue01的队列没有消息(将之前的测试删除再测试这个代码)然后将注释去掉,使用commit提交事务

可以看到队列里面有消息在等待了。我们再看消费者:

ActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory(ACTIVEMQ_URL);//2.create connect and startConnection connection=activeMQConnectionFactory.createConnection();connection.start();//3.create sessionSession session = connection.createSession(true, AUTO_ACKNOWLEDGE);//4.create 目的地Queue queue=session.createQueue(Queuep);//5.create consumerMessageConsumer messageConsumer=session.createConsumer(queue);while (true){//6.监听并获取消息TextMessage message =(TextMessage) messageConsumer.receive(1000);if(null!=message){System.out.println("消费者消费消息:"+message.getText());}else {break;}}//7.关闭资源messageConsumer.close();session.commit();session.close();connection.close();

同理,我们先测试一下注释commit,运行之后结果队列内容没变,有一个消费者

这时应为我们没有提交commit,所以事务仅仅执行了而没有提交执行结果(术语讲不来,只能说土话哈哈)

去掉注释,执行

第二部分:签收

activemq的签收机制acknowledge有四个参数:AUTO_ACKNOWLEDGE,CLIENT_ACKNOWLEDGE,DUPA_OK_ACKNOWLEDGE,SESSION_TRANSACTED

(1)AUTO_ACKNOWLEDGE  为默认签收模式,即消费者消费到消息则自动签收,服务器端显示为已消费,其他消费者不能再消费

(2)CLIENT_ACKNOWLEDGE  为手动签收模式,即消费者消费消息之后需要手动签收代码textMessage.acknowledge();完成签收,才表示消息已经被消费,示例(签收机制偏消费者,生产者参数改一下就好了,示例为非事务环境,若环境为事务环境,则没有手动签收也会被commit默认签收,但是若没有commit,手动签收也无法签收,因为事务才是最小操作单元):

package com.xiaowu.activemq;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;import static javax.jms.Session.AUTO_ACKNOWLEDGE;
import static javax.jms.Session.CLIENT_ACKNOWLEDGE;public class JmsConsumer {public static final String ACTIVEMQ_URL="tcp://152.136.12.27:61616";public static final String Queuep="queue01";public static void main(String[] args) throws JMSException {//1.create factoryActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory(ACTIVEMQ_URL);//2.create connect and startConnection connection=activeMQConnectionFactory.createConnection();connection.start();//3.create sessionSession session = connection.createSession(false, CLIENT_ACKNOWLEDGE);//4.create 目的地Queue queue=session.createQueue(Queuep);//5.create consumerMessageConsumer messageConsumer=session.createConsumer(queue);while (true){//6.监听并获取消息TextMessage textMessage =(TextMessage) messageConsumer.receive(1000);if(null!=textMessage){System.out.println("消费者消费消息:"+textMessage.getText());//手动签收textMessage.acknowledge();}else {break;}}//7.关闭资源messageConsumer.close();
//        session.commit();session.close();connection.close();}
}

运行结果图就不贴了,和之前没什么差距

(3)DUPA_OK_ACKNOWLEDGE  带副本的允许重复消费的消息,即在签收之前其他消费者可以同时消费,视频老师没讲说不重要,这个留着以后遇到再说。

(4)SESSION_TRANSACTED  老师啥也没讲。。。那就这样吧@_@

activemq事务处理及签收相关推荐

  1. SpringBoot整合activeMQ消息队列手动签收(Session.CLIENT_ACKNOWLEDGE)为什么失效啊?

    今天在家隔离办公,不太忙,然后就琢磨起来消息队列activeMQ的消息事务来解决分布式事务,但是奈何在SpringBoot整合activeMQ时,其消费者手动签收消息时出现了问题-->当acti ...

  2. SpringCloudAlibaba个人面试汇总

    分享一套牛逼SpringCloudAlibaba视频 docker 搭建各种环境资料:必学docker容器技术 牛逼SpringCloudAlibaba学习视频 已上传点我下载 由于跳转连接可能会找不 ...

  3. ActiveMQ 事务消息 手工签收

    发送端/生产者(带有事务): import javax.jms.Connection; import javax.jms.Destination; import javax.jms.MessagePr ...

  4. ActiveMQ的签收方式

    总共有三种签收方式,注意session的签方式在生产者和消费者中都得修改. 1.自动签收. Session session =connection.createSession(false, Sessi ...

  5. ActiveMQ的消息存储和持久化

    概述 为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一半都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久 ...

  6. JMS规范、ActiveMQ Broker和ActiveMQ传输协议

    Java实现ActiveMQ通讯(构建过程) 编写pom.xml配置文件 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ ...

  7. JMS ActiveMQ研究文档

    1. 背景 当前,CORBA.DCOM.RMI等RPC中间件技术已广泛应用于各个领域.但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:(1)同步通信:客户发出调用后,必须等待服务 ...

  8. activemq - 浅析消息确认模式

    2019独角兽企业重金招聘Python工程师标准>>> 前言 JMS的消息确认模式,定义了客户端(消息发送者或者消费者)与broker确认消息的方式,可以认为是客户端与Broker之 ...

  9. ActiveMQ入门教程(三) - ActiveMQ P2P版的HelloWorld

    为什么80%的码农都做不了架构师?>>>    在这篇博客,我们来写一个ActiveMQ版的HelloWorld. 其实,要想写程序的话,还是要先了解一下JMS规范里的东西. 可以参 ...

  10. ActiveMQ的消息重发策略和DLQ处理

    2019独角兽企业重金招聘Python工程师标准>>> ActiveMQ的消息重发策略和DLQ处理 博客分类: MQ 在以下三种情况中,ActiveMQ消息会被重发给客户端/消费者: ...

最新文章

  1. ASP.NET MVC4中调用WEB API的四个方法
  2. intellij idea不显示git push按钮的解决办法
  3. gridview的buttonfield获取该行的索引值(实例讲解)
  4. Linux下文件的三个时间:ctime、mtime、atime的区别
  5. iOS逆向之深入解析App签名的双向验证机制和原理
  6. ssh报错java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.service.impl.EmpServi
  7. python 类的内置方法_【转】[python] 类常用的内置方法
  8. 计算机2010ppt试题,2010年职称计算机:PowerPoint2000试题及答案
  9. dwz框架在网站群项目中的应用(2)—html拓展之页面形式
  10. www.12306.cn是安抚群众心灵的吧?
  11. 百度AI快车道PaddleNLP实战营空降南京,11月9日技术大咖线下开讲
  12. 检测MOS管五种方法
  13. windows 如何设置定时任务执行程序
  14. matlab有LLG方程的解么,matlab在常微分方程数值解中应用.docx
  15. java实现模拟时钟表盘
  16. 开源WebGIS开发——如何创建一张地图
  17. 万元:蜂拥而至 地产板块注意风险但机遇犹存
  18. 教你创建Oracle复合索引(精)
  19. 少吃柿子、山楂、黑枣,警惕鞣酸
  20. 专业mac绘图软件:FireAlpaca for Mac

热门文章

  1. java null转string_java null强转string
  2. STM32-串口通信详解
  3. STM32串口通信DMA方式
  4. 数电第三章 布尔代数与逻辑函数化简
  5. 《Mimics软件临床应用:计算机辅助外科手术》目录摘要
  6. 你真的分得清系统误差、随机误差和偶然误差吗?(含例题)
  7. UDP测试工具(ace版本)
  8. LaTeX语法环境配置:TeXLive + WinEdt
  9. Java数据持久层框架
  10. web安全与渗透测试培训全套视频