责任链模式+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("结束");
    }
相关推荐
白远山4 分钟前
家政服务派单平台搭建实战指南:从需求分析到系统设计全流程解析
java·开发语言·架构·uni-app·需求分析
午彦琳12 分钟前
2026.9.11
数据结构·python·算法
Tairitsu_H20 分钟前
[C++] C++11右值引用与移动语义揭秘
开发语言·c++·c++11·右值引用·移动语义
麻辣布丁36 分钟前
java集合篇面试模拟
java·开发语言·面试
niucloud-admin37 分钟前
JAVA V6 多商户商城 开发文档——插件开发规范
java·开发语言
新时代牛马39 分钟前
ATF/ TEE / REE 与ARM 异常级别EL 安全体系完整篇:TrustZone硬件到 SMC 进OP-TEE的全链路
arm开发·python·安全
寥落半伤感41 分钟前
在Pycharm中一键迅速安装包及查看虚拟环境中包名的方法
ide·python·pycharm
呆呆在发呆.1 小时前
Agnet狼人杀
人工智能·python·microsoft
hhzz1 小时前
【OpenCV 入门到精通 04】视频入门与绘图交互:从摄像头到鼠标画笔
人工智能·python·opencv·计算机视觉·音视频·交互
Thomas.Sir1 小时前
第40课:TensorFlow|模型推理部署前置知识【离线推理、接口调用基础】
人工智能·python·tensorflow