`

ActiveMq中Session的事务与消息过期

阅读更多

ActiveMQ有支持两种事务,

  • JMS transactions - the commit() / rollback() methods on a Session (which is like doing commit() / rollback() on a JDBC connection)
  • XA Transactions - where the XASession acts as an XAResource by communicating with the Message Broker, rather like a JDBC Connection takes place in an XA transaction by communicating with the database.

在支持事务的session中,producer发送message时在message中带有transaction ID。broker收到message后判断是否有transaction ID,如果有就把message保存在transaction store中,等待commit或者rollback消息。所以ActiveMq的事务是针对broker而不是producer的,不管session是否commit,broker都会收到message。

如果producer发送模式选择了persistent,那么message过期后会进入死亡队列。在message进入死亡队列之前,ActiveMQ会删除message中的transaction ID,这样过期的message就不在事务中了,不会保存在transaction store中,会直接进入死亡队列。具体删除transaction ID的地方是在

org.apache.activemq.util.BrokerSupport的doResend,将transaction ID保存在了originalTransactionID中,删除了transaction ID

 

public static void doResend(final ConnectionContext context, Message originalMessage, ActiveMQDestination deadLetterDestination, boolean copy) throws Exception {       
        Message message = copy ? originalMessage.copy() : originalMessage;
        message.setOriginalDestination(message.getDestination());
        message.setOriginalTransactionId(message.getTransactionId());
        message.setDestination(deadLetterDestination);
        message.setTransactionId(null);
        message.setMemoryUsage(null);
        message.setRedeliveryCounter(0);
        boolean originalFlowControl = context.isProducerFlowControl();
        try {
            context.setProducerFlowControl(false);
            ProducerInfo info = new ProducerInfo();
            ProducerState state = new ProducerState(info);
            ProducerBrokerExchange producerExchange = new ProducerBrokerExchange();
            producerExchange.setProducerState(state);
            producerExchange.setMutable(true);
            producerExchange.setConnectionContext(context);
            context.getBroker().send(producerExchange, message);
        } finally {
            context.setProducerFlowControl(originalFlowControl);
        }

 

 

 

 

分享到:
评论

相关推荐

    ActiveMQ完整项目示例

    ActiveMQ是Apache软件基金会下的一个开源消息中间件,它遵循JMS(Java消息服务)规范,用于在分布式系统中传递消息。在本项目示例中,我们将深入探讨如何使用MyEclipse 10开发基于ActiveMQ的消息通信应用。 1. **...

    ActiveMQ技术研究要点

    ActiveMQ 是一款开源的消息中间件,它遵循Java Message Service (JMS) 规范,用于在分布式系统中高效地传输消息。在深入了解ActiveMQ之前,我们先来了解一下JMS的基本概念。 JMS(Java Message Service)是Java平台...

    2019实战ActiveMQ集群与应用实战视频教程

    根据提供的文件信息,以下是从标题、描述、...通过学习这些知识点,不仅可以帮助开发者深入了解 ActiveMQ 的工作原理,还能够掌握如何在实际项目中有效地利用 ActiveMQ 解决消息传递问题,提高系统的稳定性和扩展性。

    ActiveMQ快速上手 PDF

    - **基本概念**:JMS(Java Message Service)是一种与平台无关的 API,用于在两个应用程序之间,或分布式系统中的组件之间进行消息交换。 - **消息结构**:消息包含头部(Header)、属性(Properties)和体(Body)...

    activeMQ介绍

    ActiveMQ以其高效、稳定和灵活的特性在分布式系统中广泛应用,为企业级应用提供了可靠的消息传递和解耦能力。 在ActiveMQ 5.0的二进制发布包中,包含了用于启动Broker的`activemq`脚本,用户可以直接执行此脚本来...

    ActiveMQ入门及深入使用的例子

    5. **消息优先级与时间戳**:ActiveMQ允许设置消息优先级,以便处理紧急任务,同时支持消息的过期时间。 6. **消息筛选和过滤**:通过订阅者可以设定过滤规则,只接收满足条件的消息。 现在,我们来探讨如何开始...

    ActiveMQ in Action

    - **消息属性**:可以附加额外的信息到消息中,这些信息不包含在消息头内。 - **消息体**:实际承载的消息内容。JMS定义了几种消息类型,包括`TextMessage`、`MapMessage`、`BytesMessage`、`StreamMessage`和`...

    ActiveMQ使用手册(中文版)

    #### 一、ActiveMQ 原理与基本构件 **1.1 连接工厂(Connection Factory):** - **定义:** 连接工厂是客户端用来创建连接的对象。在ActiveMQ中,`ActiveMQConnectionFactory` 类提供了这种功能。 - **作用:** 它负责...

    ActiveMQ(中文)参考手册.doc

    ActiveMQ是中国最流行的...ActiveMQ的灵活性和稳定性使其成为企业级消息传递的首选,广泛应用于微服务架构、事件驱动设计以及分布式系统中。正确理解和使用这些JMS和ActiveMQ的概念是确保消息传递可靠性和效率的关键。

    activeMQ,JMS学习资料.pdf

    ActiveMQ和JMS是企业级消息传递的重要组成部分,它们为分布式系统中的应用程序提供了可靠的数据交换手段。Java消息服务(JMS)是一种API,由Sun Microsystems开发,用于在Java应用程序之间交换消息。ActiveMQ则是...

    JMS ActiveMQ

    3. 策略配置,用于设置消息过期、死信处理等。 4. 安全性管理,支持用户认证和权限控制。 5. 通过Web Console进行管理和监控。 6. 通过JMX进行远程管理。 五、实例演示 创建一个ActiveMQ实例,首先需要下载并启动...

    ActiveMQ(中文)参考手册.pdf

    在详细解释ActiveMQ中文参考手册中提及的知识点之前,需要先介绍Java消息服务(JMS)的基本概念,因为ActiveMQ是一个基于JMS规范的消息中间件。 JMS(Java Message Service)是一套Java的消息服务接口标准,它提供...

    ActiveMQ_in_Action.doc

    - 会话(Session):单线程上下文,用于创建消息生产者、消费者和消息,提供事务性操作。 - 目的地(Destination):消息的目标或来源,分为队列(Queue)和主题(Topic)两种类型。 - 消息生产者(Message ...

    activemq学习资料.docx

    * 会话(Session):JMS Session是一个生產和消费消息的单线程上下文,提供了一个事务性的上下文,在这个上下文中,一组发送和接收被组合到了一个原子操作中。 * 目的地(Destination):客户端用来指定它生产的消息...

    ActiveMQ-API

    ActiveMQ-API是一个重要的消息中间件组件,主要用于在分布式系统中传递消息。ActiveMQ是Apache软件基金会的一个开源项目,它提供了一种高效、可靠且灵活的方式来处理应用程序之间的消息通信。在这个API中,我们可以...

    activeMQ_JMS学习资料

    在事务性会话中,事务提交时自动确认消息;在非事务性会话中,确认策略依赖于创建会话时设定的应答模式。 - `AUTO_ACKNOWLEDGE`:消息接收即确认。 - `CLIENT_ACKNOWLEDGE`:用户显式调用`acknowledge()`方法确认...

    ActiveMQ P2p模式

    同时,掌握ActiveMQ的相关配置,如队列的持久化、消息的过期策略、以及性能优化等,也能帮助我们在实际应用中更好地利用ActiveMQ。 总的来说,ActiveMQ的P2P模式为分布式系统中的可靠通信提供了基础,通过学习和...

Global site tag (gtag.js) - Google Analytics