老师9-12分布式事务的 问题有头绪吗?
来源:9-12 分布式事务02-编码实现

wenjuhe
2019-12-30
9-12的分布式事务问题
2回答
-
亲 我要上班啊 晚上回去给你看看。
放心哈,我答疑很给力的。
还有,能不能别开新帖了?你一个问题开了五六个帖子了。
直接在原贴继续留言不可以吗?022019-12-30 -
大目
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
232019-12-31
相似问题