责任链模式+CompletableFuture异步处理

1、查询商品基础信息
2、查询商品价格
3、查询商品活动
4、查询商品库存

假设这几个服务逻辑比较独立,其实是可以并行调用,我们可以结合责任链模式和CompletableFuture进行优化:

下面是代码示例:

java 复制代码
@Service
public class ChainFactory {
    // 原型模式获取对象

    @Resource
    private  Map<String, ILogicChain> strategyChainGroup;

    public ChainFactory(Map<String, ILogicChain> strategyChainGroup) {
        this.strategyChainGroup = strategyChainGroup;
    }

    /**
     * 构建责任链并获取所有处理器的 CompletableFuture 数组
     *
     * @param productInfo 商品信息对象
     * @return CompletableFuture 数组
     */
    public CompletableFuture<Void>[] openLogicChain(ProductInfo productInfo) {
        // 按照配置顺序装填责任链;
        ILogicChain logicChain = strategyChainGroup.get(LogicModel.BASIC_INFO_SERVICE_HANDLER.getCode());
        ILogicChain current = logicChain;
        List<CompletableFuture<Void>> futures = new ArrayList<>();

        //遍历LogicModel的code
        LogicModel[] ruleModels = LogicModel.values();
        for (int i = 1; i < ruleModels.length; i++) {
            ILogicChain nextChain = strategyChainGroup.get(ruleModels[i].getCode());
            current.appendNext(nextChain);
        }

        // 获取所有处理器的 CompletableFuture
        current = logicChain;
        while (current != null) {
            CompletableFuture<Void> future = current.logic(productInfo);
            futures.add(future);
            current = current.next();
        }

        return futures.toArray(new CompletableFuture[0]);
    }


    @Getter
    @AllArgsConstructor
    public enum LogicModel {

        BASIC_INFO_SERVICE_HANDLER("basicInfoServiceHandler", "实现商品基础信息补全节点"),
        PRICE_SERVICE_HANDLER("priceServiceHandler", "实现商品价格补全节点"),
        ACTIVITY_SERVICE_HANDLER("activityServiceHandler", "实现商品活动补全节点"),
        INVENTORY_SERVICE_HANDLER("inventoryServiceHandler", "实现商品库存服务节点")
        ;

        private final String code;
        private final String info;

    }

}
java 复制代码
@Slf4j
@Component("activityServiceHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ActivityServiceHandler extends AbstractLogicChain {
    @Override
    public CompletableFuture<Void> logic(ProductInfo productInfo) {
        CompletableFuture<Void> future = new CompletableFuture<>();
        // 模拟异步调用外部服务,修改商品信息对象
        CompletableFuture.runAsync(() -> {
            // 补充商品活动数据
            productInfo.setActivity("...");
            //休眠10秒
            try {
                TimeUnit.SECONDS.sleep(10);
                log.info("activityServiceHandler logic 结束:{}",now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            future.complete(null);
        });
        return future;
    }

}
java 复制代码
@Slf4j
@Component("basicInfoServiceHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class BasicInfoServiceHandler extends AbstractLogicChain {


    @Override
    public CompletableFuture<Void> logic(ProductInfo productInfo) {
        CompletableFuture<Void> future = new CompletableFuture<>();
        // 模拟异步调用外部服务,修改商品信息对象
        CompletableFuture.runAsync(() -> {
            // 补充商品基础信息数据
            productInfo.setBasicInfo("...");
            //休眠10秒
            try {
                TimeUnit.SECONDS.sleep(10);
                log.info("basicInfoServiceHandler logic 结束:{}",now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            future.complete(null);
        });
        return future;
    }

}
java 复制代码
@Slf4j
@Component("inventoryServiceHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class InventoryServiceHandler extends AbstractLogicChain {


    @Override
    public CompletableFuture<Void> logic(ProductInfo productInfo) {
        CompletableFuture<Void> future = new CompletableFuture<>();
        // 模拟异步调用外部服务,修改商品信息对象
        CompletableFuture.runAsync(() -> {
            // 补充商品库存数据
            productInfo.setInventory(100);
            //休眠10秒
            try {
                TimeUnit.SECONDS.sleep(10);
                log.info("inventoryServiceHandler logic 结束:{}",now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            future.complete(null);
        });
        return future;
    }
}
java 复制代码
@Slf4j
@Component("priceServiceHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PriceServiceHandler extends AbstractLogicChain {


    @Override
    public CompletableFuture<Void> logic(ProductInfo productInfo) {
        CompletableFuture<Void> future = new CompletableFuture<>();
        // 模拟异步调用外部服务,修改商品信息对象
        CompletableFuture.runAsync(() -> {
            // 补充商品价格数据
            productInfo.setPrice(100.0);
            //休眠10秒
            try {
                TimeUnit.SECONDS.sleep(10);
                log.info("priceServiceHandler logic 结束:{}",now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            future.complete(null);
        });
        return future;
    }


}
java 复制代码
@Data
public class ProductInfo {
    //模拟商品基础信息
    private String basicInfo;
    //商品价格
    private double price;
    //模拟商品活动信息
    private String activity;
    //模拟商品库存
    private int inventory;

    // 省略构造函数、getter和setter
}
java 复制代码
@Slf4j
public abstract class AbstractLogicChain implements ILogicChain {

    private ILogicChain next;

    @Override
    public ILogicChain next() {
        return next;
    }

    @Override
    public ILogicChain appendNext(ILogicChain next) {
        this.next = next;
        return next;
    }


}
java 复制代码
public interface ILogicChain extends ILogicChainArmory, Cloneable {

    /**
     * 责任链接口
     *
     * @param productInfo    请求对象
     * @return
     */
    CompletableFuture<Void> logic(ProductInfo productInfo);

}
java 复制代码
public interface ILogicChainArmory {

    ILogicChain next();

    ILogicChain appendNext(ILogicChain next);

}

测试类

java 复制代码
@Resource
    private ChainFactory chainFactory;


    @Test
    public void testAsyncChain() {
        // 创建一个 ProductInfo 对象
        ProductInfo productInfo = new ProductInfo();

		// 获取所有处理器的 CompletableFuture 数组
        CompletableFuture<Void>[] futures = chainFactory.openLogicChain(productInfo);

        // 等待所有责任链处理完成
        CompletableFuture.allOf(futures).join();

        log.info("结束");
    }
相关推荐
zy_destiny几秒前
【工业场景】用YOLOv8实现抽烟识别
人工智能·python·算法·yolo·机器学习·计算机视觉·目标跟踪
Tiger_shl6 分钟前
C# 预处理指令 (# 指令) 详解
开发语言·c#
(●—●)橘子……17 分钟前
记力扣2009:使数组连续的最少操作数 练习理解
数据结构·python·算法·leetcode
@Kerry~38 分钟前
phpstudy .htaccess 文件内容
java·开发语言·前端
CRMEB系统商城39 分钟前
CRMEB多商户系统(PHP)v3.3正式发布,同城配送上线[特殊字符]
java·开发语言·小程序·php
nueroamazing1 小时前
PPT-EA:PPT自动生成器
vue.js·python·语言模型·flask·大模型·项目·ppt
sali-tec1 小时前
C# 基于halcon的视觉工作流-章45-网格面划痕
开发语言·算法·计算机视觉·c#
一壶浊酒..1 小时前
python 爬取百度图片
开发语言·python·百度
机器视觉知识推荐、就业指导1 小时前
C语言中的预编译是什么?何时需要预编译?
c语言·开发语言
该用户已不存在1 小时前
工具用得好,Python写得妙,9个效率工具你值得拥有
后端·python·编程语言