后续场景思路分析
上篇文章
重复请求的幂等接口设计的思考(一)中,采用insert ignore方式完成了幂等接口的设计。文章末尾提出的一个问题,不知道大家是如何解决。
在具体应用场景中,对于幂等接口,可能会出现:
1.上游消息内容错误
2.接口内部代码出现异常等其他原因导致未完成原本的业务功能
这个时候需要再次执行幂等接口,该如何处理呢?
思路:首先想到的就是写一个手动的接口,根据传入参数去删除特定业务的幂等数据。也可以采用定时任务方式,根据具体状态值查找出需要重新执行的业务再次执行。(项目中两种都使用了)
具体代码实现
创建token_bus表
重点是业务唯一值字段和状态字段。
大家可以根据不同业务场景添加其他字段内容。
如果想做得更细,可以把状态细化(例如:未执行、执行中、执行异常、执行成功…),也可添加描述异常信息的字段用来具体定位此接口的失败原因,这样能够更细致完善的写手动和自动重新执行接口了。(这样复杂度就跟着提升了,最终根据具体业务场景灵活处理)
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(name = "token_bus")
@ToString
public class TokenBus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(length = 32)
public int id;
/** 业务唯一值 (添加了唯一索引) */
@Column(name = "unique_key", nullable = false, length = 64, unique = true)
private String uniqueKey;
/** 0-开始执行 1- 执行结束*/
@Column(name = "state", nullable = false)
private Byte state;
/** 记录创建日期 */
private Date createdAt;
/** 记录更新日期 */
private Date updatedAt;
}
插入sql语句
@Modifying
@Query(nativeQuery = true,value = "insert ignore into token_bus (unique_key, state, created_at, updated_at) values (?1, ?2 ,?3, ?4)")
int insert(String key, Byte state, Date createdAt, Date updatedAt);
具体业务层代码就不详细写了,如有需要欢迎留言或者添加微信一起探讨。刚刚文中提到用定时任务去处理异常情况再执行问题,下篇讲讲springboot的定时任务的对接。
更多文章
三年程序员的第一篇公号文章
自动化远程登陆操作和传输文件(scp ssh expect)
长按二维码关注,阅读我的程序员故事