Gobrs-Async 核心包com.gobrs.async.core.task详解高性能异步任务编排指南一、Gobrs-Async 框架概览Gobrs-Async 是一款功能强大、配置灵活、带有全链路异常回调、内存优化、异常状态管理于一身的高性能多线程并发编程和动态编排框架。它诞生于应对复杂业务场景下异步线程复杂性、任务依赖性以及异常状态难以控制的痛点为开发者提供了简洁优雅的任务编排解决方案。与传统的CompletableFuture相比Gobrs-Async 的核心理念在于将任务编排逻辑从代码中剥离出来通过配置文件即可定义复杂的任务依赖关系而无需编写大量冗余的异步编排代码。框架底层主要使用CountDownLatch、ReentrantLock、volatile等并发技术无需依赖任何中间件即可完成高性能的异步任务调度。在 Gobrs-Async 的架构中com.gobrs.async.core.task包承担着任务定义与生命周期管理的核心职责。每个异步执行单元都需要继承该包中的AsyncTask抽象类并通过实现其核心方法来定义任务的具体行为。可以说理解这个包是掌握整个 Gobrs-Async 框架的基石。二、核心类 AsyncTask 详解AsyncTask是com.gobrs.async.core.task包中最核心的抽象类开发者自定义的所有异步任务都需要继承它。Gobrs-Async 相对于其他异步编排框架的一个显著优势在于它对任务的生命周期提供了完善的支持从节点的开始、执行到结束包括中间出现异常都有相应的方法可供覆写。2.1 AsyncTask 核心方法方法用途说明task(Object o, TaskSupport support)任务的核心业务逻辑必须实现执行具体的业务处理begin(Object o, TaskSupport support)任务开始前的准备工作可选任务开始前调用可用于初始化操作end(Object o, TaskSupport support)任务结束后的收尾工作可选任务执行完成后调用无论成功或失败nessary(Object o, TaskSupport support)判断任务是否需要执行可选返回 true 则执行false 则跳过onError(TaskSupport support, Throwable throwable)任务异常处理回调可选任务执行出现异常时调用2.2 注解 TaskGobrs-Async 提供了Task注解用于为任务配置额外的执行属性timeoutInMilliseconds设置任务的超时时间毫秒超过该时间后任务将被中断name指定任务的名称便于在配置文件中引用三、快速上手3.1 环境准备与依赖引入在 Spring Boot 项目中引入 Gobrs-Async 的 starter 依赖xmldependency groupIdio.github.memorydoc/groupId artifactIdgobrs-async-starter/artifactId version1.2.9-RELEASE/version /dependency3.2 定义异步任务创建自定义的异步任务类继承AsyncTask并覆写task()方法。以电商订单处理场景为例定义以下几个异步任务javaimport com.gobrs.async.core.TaskSupport; import com.gobrs.async.core.task.AsyncTask; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; Slf4j Component public class UserInfoTask extends AsyncTaskOrderContext, UserInfo { Override public void begin(OrderContext context, TaskSupport support) { log.info(用户信息查询任务开始订单ID: {}, context.getOrderId()); } Override public UserInfo task(OrderContext context, TaskSupport support) { // 模拟查询用户信息 log.info(查询用户信息用户ID: {}, context.getUserId()); UserInfo userInfo new UserInfo(); userInfo.setUserId(context.getUserId()); userInfo.setUserName(张小明); userInfo.setVipLevel(3); return userInfo; } Override public void end(OrderContext context, TaskSupport support) { log.info(用户信息查询任务结束); } Override public void onError(TaskSupport support, Throwable throwable) { log.error(用户信息查询任务执行失败, throwable); } }javaSlf4j Component public class ProductInfoTask extends AsyncTaskOrderContext, ProductInfo { Override public ProductInfo task(OrderContext context, TaskSupport support) { log.info(查询商品信息商品ID: {}, context.getProductId()); // 模拟商品信息查询 ProductInfo productInfo new ProductInfo(); productInfo.setProductId(context.getProductId()); productInfo.setProductName(高性能编程实战指南); productInfo.setPrice(129.00); productInfo.setStock(1000); return productInfo; } }javaSlf4j Component public class InventoryTask extends AsyncTaskOrderContext, InventoryInfo { Override public InventoryInfo task(OrderContext context, TaskSupport support) { // 从上下文中获取商品信息 ProductInfo productInfo support.getTaskResult(ProductInfoTask.class); log.info(查询库存信息商品ID: {}, 商品名称: {}, productInfo.getProductId(), productInfo.getProductName()); // 模拟库存查询 InventoryInfo inventoryInfo new InventoryInfo(); inventoryInfo.setProductId(productInfo.getProductId()); inventoryInfo.setAvailableStock(850); return inventoryInfo; } }javaSlf4j Component public class OrderCalculationTask extends AsyncTaskOrderContext, OrderResult { Override public OrderResult task(OrderContext context, TaskSupport support) { // 获取前置任务的执行结果 UserInfo userInfo support.getTaskResult(UserInfoTask.class); ProductInfo productInfo support.getTaskResult(ProductInfoTask.class); InventoryInfo inventoryInfo support.getTaskResult(InventoryTask.class); log.info(开始计算订单信息用户: {}, 商品: {}, userInfo.getUserName(), productInfo.getProductName()); OrderResult orderResult new OrderResult(); orderResult.setOrderId(context.getOrderId()); orderResult.setUserName(userInfo.getUserName()); orderResult.setProductName(productInfo.getProductName()); // 根据用户 VIP 等级计算折扣 double discount calculateDiscount(userInfo.getVipLevel()); double finalPrice productInfo.getPrice() * discount; orderResult.setFinalPrice(finalPrice); orderResult.setAvailableStock(inventoryInfo.getAvailableStock()); return orderResult; } private double calculateDiscount(int vipLevel) { if (vipLevel 5) return 0.8; if (vipLevel 3) return 0.9; return 1.0; } }3.3 配置任务编排规则在application.yml中配置任务依赖关系yamlspring: gobrs: async: rules: - name: orderProcess content: UserInfoTask,ProductInfoTask-InventoryTask-OrderCalculationTask config: timeout-core-size: 200 # 超时监听线程池核心线程数上述配置的含义UserInfoTask和ProductInfoTask并行执行两者都完成后执行InventoryTask最后执行OrderCalculationTask。3.4 启动任务编排javaRestController RequestMapping(/order) public class OrderController { Autowired private GobrsAsync gobrsAsync; PostMapping(/process) public OrderResult processOrder(RequestBody OrderRequest request) { // 构建任务上下文参数 OrderContext context new OrderContext(); context.setOrderId(request.getOrderId()); context.setUserId(request.getUserId()); context.setProductId(request.getProductId()); // 方式一所有任务共享同一个参数DataContext 上下文 AsyncResultOrderResult asyncResult gobrsAsync.go( orderProcess, () - context, 5000 // 超时时间 5 秒 ); // 获取执行结果 return asyncResult.getResult(); } }四、高级特性与最佳实践4.1 任务条件执行nessary 方法nessary()方法返回true时任务被执行返回false时任务被跳过。这在需要根据上下文动态决定是否执行某个任务时非常有用javaSlf4j Component public class CouponTask extends AsyncTaskOrderContext, CouponInfo { Override public boolean nessary(OrderContext context, TaskSupport support) { // 只有使用优惠券时才执行该任务 return context.isUseCoupon(); } Override public CouponInfo task(OrderContext context, TaskSupport support) { log.info(查询可用优惠券信息); CouponInfo coupon new CouponInfo(); coupon.setDiscountAmount(10.0); return coupon; } }4.2 任务超时控制使用Task注解配置任务的超时时间javaSlf4j Component Task(timeoutInMilliseconds 3000) // 任务超时时间 3 秒 public class SlowApiTask extends AsyncTaskOrderContext, String { Override public String task(OrderContext context, TaskSupport support) { // 模拟耗时操作 Thread.sleep(2000); return 慢速 API 调用结果; } }需要注意的是超时任务不支持线程复用因为需要通过控制线程超时来进行逻辑判断。4.3 获取前置任务结果通过TaskSupport对象的getTaskResult(Class taskClass)方法可以获取任意前置任务的执行结果java// 获取指定类型任务的执行结果 UserInfo userInfo support.getTaskResult(UserInfoTask.class); // 获取所有任务的执行结果 Map MapClass?, Object allResults support.getTaskResults();4.4 灵活的参数传递机制Gobrs-Async 支持两种参数传递方式方式一共享参数DataContext 模式所有任务使用同一个上下文对象适用于任务间需要共享数据的场景javaOrderContext sharedContext new OrderContext(); AsyncResult asyncResult gobrsAsync.go(orderProcess, () - sharedContext, 5000);方式二差异化参数不同任务使用不同的参数通过 Map 传递Map 的 key 为任务类的 Class 类型javaMapClass?, Object params new HashMap(); params.put(UserInfoTask.class, userContext); params.put(ProductInfoTask.class, productContext); AsyncResult asyncResult gobrsAsync.go(orderProcess, () - params, 5000);4.5 多命名空间配置Gobrs-Async 支持多命名空间即可以在同一配置文件中定义多个不同的任务编排规则yamlspring: gobrs: async: rules: - name: orderProcess content: UserInfoTask,ProductInfoTask-InventoryTask-OrderCalculationTask - name: refundProcess content: RefundCheckTask-RefundApprovalTask-RefundExecuteTask - name: productSearch content: SearchTask,HotRankTask,RecommendTask-MergeResultTask启动时只需指定对应的规则名称即可javaAsyncResult result1 gobrsAsync.go(orderProcess, () - params, 5000); AsyncResult result2 gobrsAsync.go(refundProcess, () - params, 3000);五、完整示例电商订单聚合处理下面是一个完整的模拟电商订单聚合处理示例包含数据模拟、任务编排和结果输出。5.1 数据模型定义javaData public class OrderContext { private String orderId; private String userId; private String productId; private boolean useCoupon; } Data public class UserInfo { private String userId; private String userName; private int vipLevel; private ListString tags; } Data public class ProductInfo { private String productId; private String productName; private Double price; private Integer stock; private String category; } Data public class InventoryInfo { private String productId; private Integer availableStock; private String warehouse; } Data public class CouponInfo { private String couponId; private Double discountAmount; private String description; } Data public class OrderResult { private String orderId; private String userName; private String productName; private Double originalPrice; private Double discountAmount; private Double finalPrice; private Integer availableStock; private ListString userTags; }5.2 模拟数据任务javaSlf4j Component public class UserInfoTask extends AsyncTaskOrderContext, UserInfo { Override public UserInfo task(OrderContext context, TaskSupport support) { // 模拟耗时 500ms 的用户信息查询 try { Thread.sleep(500); } catch (InterruptedException e) {} // 模拟数据库查询返回的用户信息 UserInfo userInfo new UserInfo(); userInfo.setUserId(context.getUserId()); userInfo.setUserName(张小明); userInfo.setVipLevel(3); userInfo.setTags(Arrays.asList(高活跃用户, 新用户)); log.info(✅ 用户信息查询完成: {} (VIP {}), userInfo.getUserName(), userInfo.getVipLevel()); return userInfo; } } Slf4j Component public class ProductInfoTask extends AsyncTaskOrderContext, ProductInfo { Override public ProductInfo task(OrderContext context, TaskSupport support) { // 模拟耗时 800ms 的商品信息查询HTTP 调用 try { Thread.sleep(800); } catch (InterruptedException e) {} ProductInfo productInfo new ProductInfo(); productInfo.setProductId(context.getProductId()); productInfo.setProductName(《高性能编程实战》); productInfo.setPrice(129.00); productInfo.setStock(1000); productInfo.setCategory(技术书籍); log.info(✅ 商品信息查询完成: {} {}, productInfo.getProductName(), productInfo.getPrice()); return productInfo; } } Slf4j Component public class CouponTask extends AsyncTaskOrderContext, CouponInfo { Override public boolean nessary(OrderContext context, TaskSupport support) { return context.isUseCoupon(); } Override public CouponInfo task(OrderContext context, TaskSupport support) { // 模拟耗时 300ms 的优惠券查询 try { Thread.sleep(300); } catch (InterruptedException e) {} CouponInfo coupon new CouponInfo(); coupon.setCouponId(COUPON_001); coupon.setDiscountAmount(15.0); coupon.setDescription(新用户专享优惠券); log.info(✅ 优惠券查询完成: 优惠 {} 元, coupon.getDiscountAmount()); return coupon; } } Slf4j Component public class InventoryTask extends AsyncTaskOrderContext, InventoryInfo { Override public InventoryInfo task(OrderContext context, TaskSupport support) { ProductInfo productInfo support.getTaskResult(ProductInfoTask.class); // 模拟耗时 400ms 的库存查询 try { Thread.sleep(400); } catch (InterruptedException e) {} InventoryInfo inventoryInfo new InventoryInfo(); inventoryInfo.setProductId(productInfo.getProductId()); inventoryInfo.setAvailableStock(productInfo.getStock() - 150); inventoryInfo.setWarehouse(华东一号仓); log.info(✅ 库存信息查询完成: 剩余库存 {}, inventoryInfo.getAvailableStock()); return inventoryInfo; } } Slf4j Component public class OrderCalculationTask extends AsyncTaskOrderContext, OrderResult { Override public OrderResult task(OrderContext context, TaskSupport support) { UserInfo userInfo support.getTaskResult(UserInfoTask.class); ProductInfo productInfo support.getTaskResult(ProductInfoTask.class); InventoryInfo inventoryInfo support.getTaskResult(InventoryTask.class); CouponInfo couponInfo support.getTaskResult(CouponTask.class); OrderResult result new OrderResult(); result.setOrderId(context.getOrderId()); result.setUserName(userInfo.getUserName()); result.setProductName(productInfo.getProductName()); result.setOriginalPrice(productInfo.getPrice()); result.setUserTags(userInfo.getTags()); result.setAvailableStock(inventoryInfo.getAvailableStock()); // 计算最终价格 double price productInfo.getPrice(); double discount calculateDiscount(userInfo.getVipLevel()); double couponAmount couponInfo ! null ? couponInfo.getDiscountAmount() : 0; double finalPrice price * discount - couponAmount; result.setDiscountAmount(couponAmount); result.setFinalPrice(finalPrice); log.info(✅ 订单计算完成: 原价{} → VIP折扣 {}折 → 优惠券减{} → 最终{}, price, discount, couponAmount, finalPrice); return result; } private double calculateDiscount(int vipLevel) { switch (vipLevel) { case 5: return 0.85; case 4: return 0.9; case 3: return 0.95; default: return 1.0; } } }5.3 编排配置与执行配置文件 application.ymlyamlspring: gobrs: async: rules: - name: orderAggregation content: UserInfoTask,ProductInfoTask,CouponTask-InventoryTask-OrderCalculationTask config: timeout-core-size: 100 task-interrupt: true # 局部异常是否打断主流程执行入口javaService Slf4j public class OrderService { Autowired private GobrsAsync gobrsAsync; public OrderResult processOrder(String orderId, String userId, String productId, boolean useCoupon) { OrderContext context new OrderContext(); context.setOrderId(orderId); context.setUserId(userId); context.setProductId(productId); context.setUseCoupon(useCoupon); log.info( 开始处理订单订单号: {}, orderId); long startTime System.currentTimeMillis(); AsyncResultOrderResult asyncResult gobrsAsync.go( orderAggregation, () - context, 10000 // 10 秒超时 ); OrderResult result asyncResult.getResult(); long elapsed System.currentTimeMillis() - startTime; log.info( 订单处理完成耗时: {}ms, elapsed); return result; } }5.4 运行结果示例执行上述代码后控制台输出如下text 开始处理订单订单号: ORDER_2026001 ✅ 用户信息查询完成: 张小明 (VIP 3) ✅ 商品信息查询完成: 《高性能编程实战》 129.0 ✅ 优惠券查询完成: 优惠 15.0 元 ✅ 库存信息查询完成: 剩余库存 850 ✅ 订单计算完成: 原价129.0 → VIP折扣 0.95折 → 优惠券减15.0 → 最终107.55 订单处理完成耗时: 892ms由于UserInfoTask、ProductInfoTask和CouponTask是并行执行的所以总耗时约等于最慢的ProductInfoTask800ms加上InventoryTask400ms最终约 900ms 即可完成全部处理。六、总结com.gobrs.async.core.task包是 Gobrs-Async 框架的任务定义基石。通过继承AsyncTask并实现task()方法开发者可以轻松地将业务逻辑封装为异步执行单元通过begin()、end()、nessary()、onError()等生命周期方法可以精细控制任务的执行流程和异常处理。Gobrs-Async 的优势在于将任务编排逻辑从代码中剥离出来通过简洁的 YAML 配置即可定义复杂的任务依赖关系极大地降低了异步编程的复杂度让开发者能够专注于核心业务逻辑的实现。在微服务聚合查询、多数据源并行处理、工作流编排等场景下Gobrs-Async 都是一个值得推荐的解决方案。示例YAML 配置示例gobrs: async: config: enable: true # 全局开关开启异步编排引擎 timeout-core-size: 200 # 超时监听线程池核心线程数 rules: # 规则1电商订单处理多级依赖 - name: order-processing # 规则名称代码中通过此名称调用 content: UserInfoTask,ProductInfoTask,CouponTask-InventoryTask-OrderCalculationTask task-interrupt: false # 局部异常不打断主流程 # catchable: true # 可选异常原样抛出不包装场景需时开启 # transaction: false # 可选是否开启事务回滚 # 规则2分叉聚合场景 - name: data-sync content: UserTask-AddressTask,OrderTask,ProductTask-ResultMergeTask task-interrupt: true # 规则3任意依赖完成即触发:any 关键字 - name: fast-response content: FastApiTask,SlowDbTask,CacheTask-CallbackTask:any task-interrupt: true # 规则4竞争独占模式:exclusive 关键字 - name: resource-contention content: HttpTask,RpcTask,MqTask-ResourceTask:any:exclusive task-interrupt: true # 规则5多分支并行编排分号分隔 - name: multi-branch content: StartTask-A1Task-A2Task-EndTask;StartTask-B1Task-B2Task-EndTask task-interrupt: false # 规则6配置化异常处理catchable: true - name: error-handling-demo content: SafeTask,UnstableApiTask-FallbackTask task-interrupt: false catchable: true # 异常不包装原样抛出供业务处理规则内容语法速查符号/关键字含义示例,并行执行无依赖同时启动A,B-C-串行依赖箭头左侧完成后右侧才开始A-B-C;分支分隔符分叉编排A-B-C;A-D-E:any任意依赖完成即触发A,B,C-D:any:exclusive竞争独占触发后中断其他依赖任务A,B,C-D:any:exclusive:not表示任务不执行A-B:not、任务类定义基础任务示例javaimport com.gobrs.async.core.TaskSupport; import com.gobrs.async.core.anno.Task; import com.gobrs.async.core.task.AsyncTask; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; Slf4j Component Task(name UserInfoTask, timeoutInMilliseconds 3000) // 任务名称 超时配置 public class UserInfoTask extends AsyncTaskOrderContext, UserInfo { Override public void prepare(Object o) { log.info(任务开始前的准备工作); } Override public UserInfo task(OrderContext context, TaskSupport support) { log.info(查询用户信息用户ID: {}, context.getUserId()); // 模拟业务逻辑 UserInfo userInfo new UserInfo(); userInfo.setUserId(context.getUserId()); userInfo.setUserName(张小明); userInfo.setVipLevel(3); return userInfo; } Override public void onSuccess(TaskSupport support) { log.info(任务执行成功回调); } Override public void onFail(TaskSupport support) { log.error(任务执行失败回调); } Override public boolean nessary(Object o, TaskSupport support) { // 返回 true 则执行任务false 则跳过 return true; } }依赖结果获取示例javaSlf4j Component Task(name OrderCalculationTask, timeoutInMilliseconds 5000) public class OrderCalculationTask extends AsyncTaskOrderContext, OrderResult { Override public OrderResult task(OrderContext context, TaskSupport support) { // 通过 getTaskResult 方法获取前置任务的执行结果 UserInfo userInfo support.getTaskResult(UserInfoTask.class); ProductInfo productInfo support.getTaskResult(ProductInfoTask.class); CouponInfo couponInfo support.getTaskResult(CouponTask.class); log.info(用户: {}, 商品: {}, userInfo.getUserName(), productInfo.getProductName()); OrderResult result new OrderResult(); result.setOrderId(context.getOrderId()); result.setUserName(userInfo.getUserName()); result.setProductName(productInfo.getProductName()); double finalPrice productInfo.getPrice(); if (couponInfo ! null) { finalPrice - couponInfo.getDiscountAmount(); } result.setFinalPrice(Math.max(finalPrice, 0)); return result; } }条件执行示例nessary 方法javaSlf4j Component Task(name CouponTask) public class CouponTask extends AsyncTaskOrderContext, CouponInfo { Override public boolean nessary(OrderContext context, TaskSupport support) { // 只有使用优惠券时才执行该任务 return context.isUseCoupon(); } Override public CouponInfo task(OrderContext context, TaskSupport support) { CouponInfo coupon new CouponInfo(); coupon.setDiscountAmount(15.0); return coupon; } }事务回滚配置可选javaSlf4j Component Task(name PaymentTask, callback true) // callback true 开启事务回滚支持 public class PaymentTask extends AsyncTaskOrderContext, PaymentResult { Override public PaymentResult task(OrderContext context, TaskSupport support) { // 支付业务逻辑 return new PaymentResult(); } Override public void rollback(DataContext dataContext) { // 事务回滚业务逻辑 log.info(执行支付回滚操作); } }启动任务编排javaService public class OrderService { Autowired private GobrsAsync gobrsAsync; public OrderResult processOrder(String orderId, String userId, boolean useCoupon) { // 构建上下文参数 OrderContext context new OrderContext(); context.setOrderId(orderId); context.setUserId(userId); context.setUseCoupon(useCoupon); // 启动任务编排规则名称与 YAML 中的 name 对应 AsyncResultOrderResult asyncResult gobrsAsync.go( order-processing, // YAML 中配置的规则名称 () - context, // 参数供应器 10000 // 整体超时时间毫秒 ); // 获取执行结果 return asyncResult.getResult(); } }参数传递两种方式共享参数DataContext 模式javaOrderContext sharedContext new OrderContext(); AsyncResultOrderResult result gobrsAsync.go( order-processing, () - sharedContext, 10000 );差异化参数MapClass?, Object params new HashMap(); params.put(UserInfoTask.class, userParam); params.put(ProductInfoTask.class, productParam); params.put(CouponTask.class, couponParam); AsyncResultOrderResult result gobrsAsync.go( order-processing, () - params, 10000 );七、完整运行结果示例 开始处理订单订单号: ORDER_001 第一阶段并行 ✅ UserInfoTask 完成: 张小明 (VIP 3) ✅ ProductInfoTask 完成: 《高性能编程实战》 129.0 ✅ CouponTask 完成: 优惠 15.0 元 第二阶段 ✅ InventoryTask 完成: 剩余库存 850 第三阶段 ✅ OrderCalculationTask 完成: 原价129.0 → 最终114.0 订单处理完成总耗时: 892ms配置项说明汇总配置项类型说明enableboolean全局开关开启/关闭异步编排引擎timeout-core-sizeint超时监听线程池核心线程数rules[].namestring规则唯一标识代码调用时使用rules[].contentstring任务依赖关系表达式rules[].task-interruptboolean局部异常是否打断主流程rules[].catchableboolean异常是否原样抛出不包装rules[].transactionboolean是否开启事务回滚