如果还不懂如何使用 Consumer 接口,来公司我当面给你讲!(一)

401 阅读2分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。

背景

没错,我还在做 XXXX 项目,还在与第三方对接接口,不同的是这次是对自己业务逻辑的处理。

在开发过程中我遇到这么一个问题:

表结构: 一张主表A ,一张关联表B ,表 A 中存储着表 B 记录的状态。

场景: 第一步创建主表数据,插入A表;第二步调用第三方接口插入B表同时更新A表的状态。此时大家应该都会想到在进行第二步的时候需要做好数据的幂等性。这样的话就会存在以下几种情况:

一、B表中不存在与A表关联的数据,此时需要调用第三方接口,插入B表同时更新A表的状态;

二、B表中存在与A表关联的数据;

  1. A表中的状态为处理中:直接返回处理中字样;
  2. A表中的状态为处理成功:直接返回成功的字样;
  3. A表中的状态为处理失败:此时需要调用第三方接口,更新B表同时更新A表的状态;

代码实现

首先我是这样编写的伪代码

B b = this.baseMapper.selectOne(queryWrapper);
if (b != null) {
	String status = b.getStatus();
	if (Objects.equals(Constants.STATUS_ING, status)){
		return "处理中";
	} else if (Objects.equals(Constants.STATUS_SUCCESS, status)){
		return "处理成功";
	}
	//失败的操作
	//请求第三方接口并解析响应结果
	......
	if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
        ......
            //更新B表操作
            bb.setStatus(Constants.STATUS_ING);
            mapper.updateById(bb);

            //更新A表的状态
            a.setStatus(Constants.STATUS_ING);
            aMapper.updateById(a);
	}
	
} else {
	//请求第三方接口并解析响应结果
	......
	if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
        ......
                //插入B表操作
		bb.setStatus(Constants.STATUS_ING);
		mapper.insert(bb);

		//更新A表的状态
		a.setStatus(Constants.STATUS_ING);
		aMapper.updateById(a);
	}
}

不知道细心的小伙伴是否发现,存在B表记录并且状态为“失败”的情况和不存在B表的情况除了插入B表或者更新B表的操作之外,其余的操作都是相同的。

如果是你,你会将该代码做怎样的重构呢?思考一下,我们在下文中给出解决方案。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!