Cube Cube
首页
  • v1.0.0
👼问答
💖支持
🤾加入咚咚群
  • 项目介绍
  • 更新记录
  • 参与研发
GitHub (opens new window)
首页
  • v1.0.0
👼问答
💖支持
🤾加入咚咚群
  • 项目介绍
  • 更新记录
  • 参与研发
GitHub (opens new window)
  • 🍤Cube简介
  • 🍑框架特性
  • 🍄快速开始

    • 🍟说明
    • 🍅集成三步走

      • 🍉SDK集成
      • 🍒申请接入
      • 🍍环境配置
    • 🍊核心楼层

      • 🍋接口开发
      • 🍣服务开发
      • 🍏任务开发
      • 🍿领域能力
        • 领域能力说明
        • 开发优惠券新人立减券领域能力
        • 领域能力的数据从那里获取
          • 获取依赖结果API
        • 扩展方式
    • 🍔共建楼层

      • 🫕依赖引入
      • 🍠共建仓库
      • 🍱应用共建
    • 🏈独立楼层

      • 🍗使用说明
      • 🥯参数注解
      • 🥫集成开发
      • 🧇楼层扩展
  • 🍓设计文档

    • 🍫资源同步设计
    • 🫕配置并发设计
    • 🍬SPI扩展设计
    • 🥩架构设计
  • 指南
  • 🍄快速开始
  • 🍊核心楼层
sizegang
2022-09-03
目录

🍿领域能力

看到这里大家应该对Cube具有了一定兴趣。坚持下去就可以完成ISV流程建设哦✊! 加油哦!⛽️

# 领域能力说明

领域能力为应用系统中业务数据的最小单元(原子性)。 例如: 优惠券分为: plus会员券、新人立减券、满减券等

那么此时优惠券一整个业务就可以设计为一个领域服务。不同的券为领域能力。 领域服务包含多种领域能力,同时这些领域能力并不是一成不变的。 不同的业务方、不同的模板可能会显示不一样的优惠券信息。那么如果通过传统的开发模式,是不是需要逻辑判断(if else、 或者 策略模式)来区分不同的业务方 对优惠券数据的不同展示形式? 那么此时Cube的能力就是解决这种问题的一种解决方案(Cube能力的一部分)

# 开发优惠券新人立减券领域能力

@CubeDomainAbility(source = CouponNewPersonRpcService.class, code = "2", description = "优惠券 新人立减信息")
public class CouponNewPersonActuator extends AbstractAbilityActuator<ProcessChannel, Object> {
    @Override
    public Object handle(ProcessChannel processChannel) {
        Result taskData = processChannel.getTaskData(CouponNewPersonRpcService.class, Result.class);
        System.out.println("BServiceActuator 执行了 taskData {}" + JSONObject.toJSONString(taskData));
        return taskData;
    }
}

# 领域能力的数据从那里获取

通过@CubeDomainAbility注解的标记, 将该类标识为一个领域能力,在应用启动时该领域能力会通过Scanner扫描的方式自动将该能力上报到Cube平台中。 开发者可以通过奥德修斯平台进行配置。

关于 @CubeDomainAbility 在这里做一下说明

  • description 领域能力描述,描述该领域能力所涉及的场景信息。
  • source 当前领域能力所依赖的数据源,该数据源为 任务开发 中的异步任务 。
  • code 领域能力的唯一标识, 最好用枚举或者常量定义,不同领域能力唯一标识不允许重复,否则程序启动时会主动抛出异常。
  • async 是否异步任务标识, 此值为扩展字段目前版本未做实现。使用者无需关注。

/**
 * The interface Act.
 *
 * @program: cube
 * @description:
 * @author: sizegang
 * @create: 2022 -07-18
 * @date 2022-07-21 23:33
 * @author sizegang1
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Component
@Documented
public @interface CubeDomainAbility {

    /**
     * Async boolean.
     *
     * @return the boolean
     */
    boolean async() default true;

    /**
     * Name string.
     *
     * @return the string
     */
    String service() default "";

    /**
     * Description string.
     *
     * @return the string
     */
    String description() default "";

    /**
     * Source class.
     * 数据单元来源自哪个 数据源
     * @return the class
     */
    Class[] source() default Object.class;

    /**
     * 必须创建code 最好用枚举值
     * @return
     */
    String code() default "";
}

# 获取依赖结果API

小伙伴看到这里肯定会问,领域能力的数据来源于哪里我现在知道了,但是我怎么获取这些依赖数据呢?那么继续往下看。 我们可以使用框架中提供的API进行取值 getTaskResult

  • AbstractChannel source 流程通道类型,透传即可。
  • Class<? extends CubeTask> clazz 所依赖数据来源于哪个任务类。
  • Class<T> targetClass 依赖数据的数据类型。
public <T> T getTaskResult(AbstractChannel source, Class<? extends CubeTask> clazz, Class<T> targetClass) {
    if (source instanceof ProcessChannel) {
        ProcessChannel processChannel = (ProcessChannel) source;
        return processChannel.getTaskData(clazz, targetClass);
    }
    if (source instanceof TemplateChannel) {
        TemplateChannel templateChannel = (TemplateChannel) source;
        return templateChannel.getTaskData(clazz, targetClass);
    }
    return null;
}

# 扩展方式

同时可以直接使用AbstractChannel 提供的 getTaskData方法获取数据。

String taskData = processChannel.getTaskData(CouponNewPersonRpcService.class, String.class);
帮助我们改善此文档 (opens new window)
上次更新: 2022/09/03, 20:56:28
🍏任务开发
🫕依赖引入

← 🍏任务开发 🫕依赖引入→

Theme by Vdoing | Copyright © 2022-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式