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)! 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
推荐阅读
发表评论