应用场景
在用户下单的时候,需要做各种校验,为了减少用户下单等待时间,采用下面的异步校验
订单校验结果类
import lombok.Data;
/**
* 订单校验结果
*/
@Data
public class OrderValidateResult {
/**
* 是否通过校验
*/
private boolean isPassValidate;
/**
* 未通过校验原因
*/
private String notPassReason;
}
异步校验
/**
* 订单校验
* 校验不通过会抛出异常
*
* @param orderRequestDTO 下单参数
*/
private void orderValidate(CreateOrderRequestDTO orderRequestDTO) {
// 黑名单校验
CompletableFuture<OrderValidateResult> blackUserValidateFuture = CompletableFuture.supplyAsync(() -> blackUserOrderValidate.checkOrder(orderRequestDTO));
// 多次重复下单校验
CompletableFuture<OrderValidateResult> repeatSubmitOrderValidateFuture = CompletableFuture.supplyAsync(() -> repeatSubmitOrderValidate.checkOrder(orderRequestDTO));
// 等待所有异步校验完成
CompletableFuture.allOf(
openIdValidateFuture, blackUserValidateFuture
).join();
// 黑名单校验结果
OrderValidateResult blackUserValidateResult = blackUserValidateFuture.join();
if (!blackUserValidateResult.isPassValidate()) {
throw new JeecgBootException(blackUserValidateResult.getNotPassReason());
}
// 是否多次重复下单
OrderValidateResult repeatSubmitOrderValidateResult = repeatSubmitOrderValidateFuture.join();
if (!repeatSubmitOrderValidateResult.isPassValidate()) {
throw new JeecgBootException(repeatSubmitOrderValidateResult.getNotPassReason());
}
}
校验订单接口
/**
* 订单校验
*/
public interface IOrderValidate {
/**
* 订单校验
* @param orderRequestDTO 请求参数
* @return 校验结果
*/
OrderValidateResult checkOrder(CreateOrderRequestDTO orderRequestDTO);
}
校验实现类
/**
* 黑名单校验
*
* @param orderRequestDTO 下单参数
* @return 校验结果
*/
@Override
public OrderValidateResult checkOrder(CreateOrderRequestDTO orderRequestDTO) {
OrderValidateResult orderValidateResult = new OrderValidateResult();
//...此处省略具体的校验逻辑,校验通过设置true,否则设置false,如果某些情况不需要校验黑名单,直接判断如果满足某个条件setPassValidate为true
orderValidateResult.setPassValidate(true);
return orderValidateResult;
}