如果状态是COMMIT_MESSAGE状态的话则broker会将消息推送给消费者。如果状态是ROLLBACK_MESSAGE状态的话则broker会丢弃此消息。如果状态是中间状态UNKNOW状态则broker会回查本地事务状态。 生产者调用TransactionListener.checkLocalTransaction()方法回查本地事务执行状态,并再次执行5,6,7三步骤,若回查次数超过15次则丢弃。
COMMIT_MESSAGE:提交事务消息,消费者可以消费此消息 ROLLBACK_MESSAGE:回滚事务消息,消息会在broker中删除,消费者不能消费 UNKNOW: Broker需要回查确认消息的状态 RocketMQ4.X分布式事务存在的问题: 订阅端的事务失败后不会影响发送方(生产者方)的事务 代码实现 1.自定义实现TransactionListener生产者的事务监听器 @Roc...
生产者根据本地事务执行结果向服务端提交二次确认结果(Commit或Rollback),服务端收到确认结果后处理逻辑...
@Qualifier("transactionProducer")privateTransactionMQProducer producer;@Transactional(rollbackFor=Exception.class)publicvoidsendTransactionMQ()throws Exception{Term term=newTerm();term.setTermYear(2020);term.setType(1);int insert=termMapper.insert(term);Message message=newMessage();message.setTopic("cluste...
当消息发送方返回LocalTransactionState.COMMIT_MESSAGE时,RocketMQ 会将半消息的状态改为“Commit”并持久化到磁盘中,同时向消息消费方发送该消息;当消息发送方返回LocalTransactionState.ROLLBACK_MESSAGE时,RocketMQ 会将半消息的状态改为“Rollback”并持久化到磁盘中,同时该消息将不会被发送到消息消费方。
}elseif(StringUtils.equals("TagB",msg.getTags())){// 消息回滚returnLocalTransactionState.ROLLBACK_MESSAGE; }elseif(StringUtils.equals("TagC",msg.getTags())){// 不做处理,不明白到底要做什么,此时会事务消息回查returnLocalTransactionState.UNKNOW; ...
messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 1d 1. 3 延时消息实现原理 具体实现方案是: 修改消息 Producer将消息发送到Broker后,Broker会首先将消息写入到commitlog文件,然后需要将其分发到相应的consumequeue。不过,在分发之前,系统会先判断消息中是否带有延时等级。
COMMIT_MESSAGE:提交事务,允许消费者消费该消息。 ROLLBACK_MESSAGE:回滚事务,消息将被丢弃不允许消费。 UNKNOW:暂时无法判断状态,等待固定时间以后消息队列RocketMQ版服务端根据回查规则向生产者进行消息回查。 创建事务消息的Producer时必须指定TransactionListener的实现类,处理异常情况下事务消息的回查。
执行结果一般有以下三种;* COMMIT_MESSAGE:表示执行成功;* ROLLBACK_MESSAGE:执行失败需要回滚事务;* UNKNOW:未知状态;(2)未发送成功,比如FLUSH_DISK_TIMEOUT刷盘超时、FLUSH_SLAVE_TIMEOUT和SLAVE_NOT_AVAILABLE从节点不可用等状态,此时意味着消息发送失败,本地事务状态置为ROLLBACK_MESSAGE准备回滚事务;...
SendResultresult=producer.send(orderMessage) if(result.getState().equals("SEND_OK"))){ connection.commit(); }else{ connection.rollback(); } 如果生产者发送消息时,因为网络原因导致10秒消息才返回SendResult结果,这就意味这10秒内数据库事务无法提交,大量并发下,数据库连接资源会在这10秒内迅速耗尽,后续...