JMS - 事务性消息
JMS 事务遵从发送操作与接收操作相互分离的约定。下图显示的是一个事务性发送,其中一组消息要么能够保证全部到达消息服务器,要么连一条消息也不能保证到达消息服务器。从发送者的角度来看,JMS 提供者为这组消息提供了高速缓存,直到执行 commit() 为止。如果发生了故障,或者执行了 rollback(),这些消息就会丢弃。在一个事务中传送给消息服务器的消息,它并不会转发给消费者,知道该生产者提交该事务为止。

生产者在会话上发布 commit() 之前,JMS 提供者不会开始向它的消费者传送消息,即使它已经从发送者处接收到所有的消息。JMS 事务的范围能够包括任意数量的消息。虽然会话 commit() 和 JTA(Java Transaction API) 事务 commit() 在概念上类似,但是二者并不相同。会话事务是由 JMS 提供者管理的,而不是由 JTA 管理的。
JMS 还支持事务性接收,消费者正在接收一组事务性消息,而且要么全部接收,要么一条也不接收,参考下图。从事务性接收者的角度来看,这些消息会尽可能快地传送给接收者,但是它们一直由 JMS 提供者保存,直到接收者在会话对象上执行 commit() 为止。如果发送了故障,或者执行 rollback(),提供者会试图重新传送消息,在这种情况下,这些消息就会设置重新传送标记。

发送消息,如果在发送消息的方法正常完成后没有调用 Session.commit() 方法,JMS 提供者会从队列中删除这些消息,而这些消息并没有传送给消息消费者。接收消息时,如果在接收消息的方法正常完成后没有调用 Session.commit() 方法,消息就会被标记为未被传送。JMS 提供者会把这些消息重新传送给消息消费者,并将 JMSRedelivered 消息头属性设置为 true,表示此前曾试图处理过这些消息。因此在这两种情况下,都必须注意:要确保在该方法结束之前,提交会话或将其回滚。
Sample Code:
// ...
Connection connection = null;
Session session = null;
try {
Context ctx = new InitialContext();
ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup("connectionFactory");
connection = connFactory.createConnection();
connection.start(); // 创建会话对象实例,第一个参数表示会话是否是启用事务
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); Destination destination = (Destination) ctx.lookup("HelloQueue");
MessageProducer msgProducer = session.createProducer(destination);
Message textMsg = session.createTextMessage("This is a test message.");
msgProducer.send(textMsg); // 提交事务
session.commit();
System.out.println("send the message successfully");
} catch (Exception e) {
if (session != null) {
try {
// 回滚事务
session.rollback();
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}
e.printStackTrace();
} finally {
JMSUtils.closeConnection(connection);
}
// ...
JMS - 事务性消息的更多相关文章
- ActiveMQ安装与入门程序 & JMS的消息结构
1.Activemq安装 直接到官网下载:记住apache的官网是域名反过来,比如我们找activemq就是activemq.apache.org. 最新版本要求最低的JDK是8,所以最好在电脑装多个 ...
- 阿里高级架构师教你使用Spring JMS处理消息事务源码案例
消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失.该源码展示如何使用本地事务解决这个问题.这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听 ...
- JMS(Java消息服务)入门教程
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...
- JMS和消息驱动Bean(MDB)
一.说明 本示例使用的ActiveMQ作为消息中间件,服务器为Glassfish,使用JMS发送消息,在MDB接收到消息之后做打印输出. 二.ActiveMQ安装配置 1.安装console war包 ...
- JMS Java消息服务(Java Message Service)
JMS 在一些场景下RPC的同步方式可能不太适合业务逻辑的处理,并且这种方式在某些场景下会导致业务的紧耦合. 基于异步交互模型的JMS解决了RPC产生的紧耦合问题,它提供了一个可以通过网络访问的抽象消 ...
- JMS异步消息机制
企业消息系统 Java Message Service 是由 Sun Microsystems 开发的,它为 Java 程序提供一种访问 企业消息系统 的方法.在讨论 JMS 之前,我们分来析一下企业 ...
- ActiveMQ JMS实现消息发送
一.创建配置消息发送接收目的地. ActiveMQ中间件地址 JMS_BROKER_URL=failover://(tcp://192.168.1.231:61616) QUEUE_BUSP_TP_S ...
- ActiveMQ消息队列从入门到实践(4)—使用Spring JMS收发消息
Java消息服务(Java Message Service ,JMS)是一个Java标准,定义了使用消息代理的通用API .在JMS出现之前,每个消息代理都有私有的API,这就使得不同代理之间的消息代 ...
- JMS(Java消息服务)入门教程(一)
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...
随机推荐
- FZU 2082 过路费 (树链剖分 修改单边权)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...
- POJ 3169 Layout (spfa+差分约束)
题目链接:http://poj.org/problem?id=3169 差分约束的解释:http://www.cnblogs.com/void/archive/2011/08/26/2153928.h ...
- Unity3D音乐音效学习笔记
对于Unity3D的音乐音效这块一直没有好好的看过,现在准备好好的研究一下,并作为一个笔记记录下. 支持格式 在游戏中,一般存在两种音乐,一种是时间较长的背景音乐,一种是时间较短的音效(比如按钮点击, ...
- 【LINUX】编程笔记
a storage class can only be specified for objects and functions extern修饰一个struct报错,错误原因如上,C++中存储类修 ...
- CCLabelTTF、CCLabelAtlas和CCLabelBMFont的区别
转自:http://blog.sina.com.cn/s/blog_67a5e47201018tj8.html 在Cocos2d以及Cocos2d-x中,我们经常会用到CCLabelTTF以及CCLa ...
- Linux单词表
su:Swith user 切换用户,切换到root用户cat: Concatenate 串联uname: Unix name 系统名称df: Disk free 空余硬盘du: Disk ...
- my-view-isnt-reflecting-changes-ive-made-to-the-underlying-tables
FROM http://sqlstudies.com/2013/01/20/my-view-isnt-reflecting-changes-ive-made-to-the-underlying-tab ...
- windows command ftp 中文文件名乱码解决方法
有时,使用临时的windows机子,要进行ftp简单操作,但又不想装其它的ftp-client,可以直接使用windows command中的命令ftp来操作. 通常,ftp服务器按标准,使用utf8 ...
- ValueBar
https://github.com/PhilJay/ValueBar
- Python标准库:迭代器Itertools
Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, star ...