老师9-12分布式事务的 问题有头绪吗?

来源:9-12 分布式事务02-编码实现

wenjuhe

2019-12-30

9-12的分布式事务问题

写回答

2回答

大目

2019-12-30

亲 我要上班啊 晚上回去给你看看。
放心哈,我答疑很给力的。
还有,能不能别开新帖了?你一个问题开了五六个帖子了。
直接在原贴继续留言不可以吗?

0
2
wenjuhe
老师,帮我看了吗,有没有头绪啊
2019-12-30
共2条回复

大目

2019-12-30

你的代码有好几处问题:

首先,项目使用的Spring Boot、Spring Cloud版本是不兼容的,你Spring Boot用的2.2.2,这个Boot版本必须Spring Cloud Hoxton才能兼容,详见《 4-2 版本与兼容性》;而目前Spring Cloud Alibaba最新的2.1.1只能兼容到Spring Cloud Greenwich。所以你的Spring Boot必须用2.1.x。(当然就目前来看,你还没有踩到坑),不过还是建议你改一下。

第二,你粗心了:com.itmuch.contentcenter.service.content.ShareService#auditById 这个方法里面,第108行

.withPayload(
        UserAddBonusMsgDTO.builder()
        .userId(share.getUserId())
        .bonus(50)
        .build()
)
        //header也有妙用
        .setHeader(RocketMQHeaders.TRANSACTION_ID, transactionId)
        .setHeader("share-id",id)

里面设置的header是share-id

而com.itmuch.contentcenter.rocketmq.AddBonusTransactionListener#executeLocalTransaction里面,第29行

MessageHeaders headers = message.getHeaders();
String transactionId = (String)headers.get(RocketMQHeaders.TRANSACTION_ID);
Integer shareId = Integer.valueOf((String)headers.get("share_id"));
try{
    this.shareService.auditByIdWithRocketMqLog(shareId,(ShareAuditDTO)o,transactionId);
    return RocketMQLocalTransactionState.COMMIT;
}catch (Exception e){
    return RocketMQLocalTransactionState.ROLLBACK;
}

你get的header是share_id

于是,在第29行,就会报空指针异常!!!!解决方案很简单:统一改成share-id或者share_id。这种问题其实很好解决,在第27行打个断点,逐行调试一下就知道了。

第三,多嘴一下,你代码里面有好几处用到了com.sun.xxx的包。sun包是比较特殊的包,一般是要杜绝使用的,具体原因可以百度下。以后编码注意一下。


我把我改好的代码上传到百度盘了。地址详见:https://pan.baidu.com/s/1U8nLGXsa9FvWpUWL9S79gg


2
3
wenjuhe
回复
大目
谢谢老师
2019-12-31
共3条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程