🍿领域能力
看到这里大家应该对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