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中 ...
随机推荐
- libevent的使用方法--回显服务器的简单实例
#include <event.h> #include <sys/types.h> #include <sys/socket.h> #include <net ...
- C语言简单实现sizeof功能代码
sizeof不是函数,而是运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义. 下面给出一个sizeof的一个宏定义实现版本 #defin ...
- 破解NET的四大神器
原本这篇文章可以更早一星期写出来与大家分享,由于某方面的原因耽搁到现在,心里竟有那么一点好像对不住大家的感觉.这当然与神器有关,因为我发现利用这四大神器我似乎觉得几乎所有的NET程序破解都不在话下了 ...
- sql的存储过程调用
USE [ChangHong_612]GO/****** Object: StoredProcedure [dbo].[st_MES_GetCodeRule] Script Date: 09/10/2 ...
- DbHelper数据操作类
摘要:本文介绍一下DbHelper数据操作类 微软的企业库中有一个非常不错的数据操作类.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过 ...
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- TC SRM 665 DIV2 B LuckyCycle 暴力
LuckyCycleTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...
- httpclient发送request请求时设置header和timeout
package com.xxx.xxx.common; import java.io.BufferedReader; import java.io.InputStreamReader; import ...
- 框架使用的技术主要是SpringMVC 在此基础上进行扩展
框架使用的技术主要是SpringMVC 在此基础上进行扩展 1 Web前端使用 2 前段控制器采用SpringMVC零配置 3 IOC容器Spring 4 ORM使用 Mybites或者hiberna ...
- [Angular-Scaled Web] 8. Using $http to load JSON data
Using the $http service to make requests to remote servers. categories-model.js: angular.module('egg ...