business_id varchar(64) DEFAULT NULL COMMENT ‘业务数据ID’, business_type tinyint(2) DEFAULT NULL COMMENT ‘业务类型:具体业务’, message_id varchar(64) NOT NULL COMMENT ‘消息ID’, retries_number tinyint(2) DEFAULT ‘0’ COMMENT ‘重试次数’, status_ tinyint(2) DEFAULT ‘0’ COMMENT ‘结果 1 成功 0 失败’, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’, PRIMARY KEY (id_), UNIQUE KEY inx_message_id (message_id) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT=‘rabbit消息记录’;

3.MQ配置

import com.xjw.config.constant.RabbitmqConstant; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;

/**

@author xiejianwei@ClassName BusinessOrderRabbitMqConfig */ @Configuration public class OrderRabbitMqConfig {

/**

初始化队列@return */ @Bean public Queue orderQueue() { return new Queue(RabbitmqConstant.ORDER_QUEUE, true); }

/**

初始化交换机@return */ @Bean public DirectExchange orderExchange() { return new DirectExchange(RabbitmqConstant.ORDER_EXCHANGE, true, false); }

/**

队列通过路由键绑定到交换机@return */ @Bean public Binding bind() { return BindingBuilder.bind(orderQueue()).to(orderExchange()).with(RabbitmqConstant.ORDER_ROUTING_KEY); } }

3.实体类

import lombok.Getter; import lombok.Setter;

import java.util.Date; import java.util.UUID;

/**

@author xiejianwei */ @Getter @Setter public class MessageRecord {

/**

主键ID */ private Long id;

/**

业务数据ID / private String businessId; /*业务类型 / private int businessType; /*消息ID / private String messageId; /*重试次数 / private int retriesNumber; /*消息状态 (0.失败,1成功) / private int status; /*创建时间 */ private Date createTime;

public MessageRecord() { }

public MessageRecord(String businessId, int businessType) { this.businessId = businessId; this.businessType = businessType; this.messageId = UUID.randomUUID().toString().replace(“-”, “”).toLowerCase(); this.retriesNumber = 0; this.createTime = new Date(); this.status = 0; } }

import java.math.BigDecimal;

/**

@author xiejianwei */ @Getter @Setter public class Order extends SerializableDto {

/**

订单编号 */ private String orderId;

/**

订单金额 */ private BigDecimal amount;

/**

做简单的例子就不关联业务ID了 */ private String productName; }

4.业务实现

import com.xjw.entity.pojo.MessageRecord; import com.xjw.entity.pojo.Order; import com.xjw.service.MessageRecordService; import com.xjw.service.OrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;

/**

@author xiejianwei */ @Service @Slf4j public class OrderServiceImpl implements OrderService {

@Autowired public MessageRecordService messageRecordService;

/**

模拟发起一个简单的订单@param order@return */ @Override @Transactional(rollbackFor = Exception.class) public boolean start(Order order) { //触发保存本地消息表 MessageRecord messageRecord = new MessageRecord(order.getOrderId(), 1); messageRecordService.preCommit(messageRecord); log.info(“这里可以做本地业务操作”); log.info(“下单中,请稍等-----”); log.info(“恭喜您,下单成功,订单号:{}”, order.getOrderId()); // 操作本地事务成功则commit 消息,如果处理本地事务异常,则会有定时任务回调 messageRecordService.commit(messageRecord.getMessageId(), true); return true; } }

import com.alibaba.fastjson.JSON; import com.xjw.config.constant.RabbitmqConstant; import com.xjw.entity.pojo.MessageRecord; import com.xjw.mapper.MessageRecordMapper; import com.xjw.service.MessageRecordService; import com.xjw.service.RabbitmqService; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

import java.util.List;

/**

@author xiejianwei */ @Service public class MessageRecordServiceImpl implements MessageRecordService {

@Autowired public MessageRecordMapper messageRecordMapper;

@Autowired public RabbitmqService rabbitmqService;

@Override public boolean preCommit(MessageRecord messageRecord) { return messageRecordMapper.insert(messageRecord); }

@Override public boolean commit(String messageId, boolean commitFlag) { /**

不提交则代表回滚 / if (!commitFlag) { messageRecordMapper.delete(messageId); return true; } // 提交消息到MQ MessageRecord messageRecord = messageRecordMapper.find(messageId); /*发送MQ消息将唯一消息ID设置给CorrelationData回调时可以用这个ID查找到数据对应的消息记录 */ rabbitmqService.sendMessage(RabbitmqConstant.ORDER_EXCHANGE, RabbitmqConstant.ORDER_ROUTING_KEY, JSON.toJSONString(messageRecord), new CorrelationData(messageRecord.getMessageId())); return true; }

@Override public void update(String messageId) { messageRecordMapper.update(messageId); }

@Override public MessageRecord find(String messageId) { return messageRecordMapper.find(messageId); }

@Override public List findAll(int status) { return messageRecordMapper.findAll(status); } }

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后

小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)! 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 就是希望能够帮助到大家,减轻大家的负担和节省时间。

关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。

[外链图片转存中…(img-2jDNmUR3-1712958355376)]

这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)! 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。