超级业务链
[👉 源码](https://github.com/geniusay/Assistant)
<dependency>
<groupId>io.github.geniusay</groupId>
<artifactId>assistant-boot-start</artifactId>
<version>1.1.1</version>
</dependency>
2
3
4
5
6
7
8
# 超级业务链
简述
对于开发人员来说:长且冗余的业务链,if-else链,往往让我们在编写,理解,维护,修改的时候陷入头疼,一些高度重复的业务流程难以被复用,导致许多无用代码在项目中增加。
Assistant提供的超级业务链,可以让你轻松的编写业务链,并让业务链的编写,理解,维护,修改变得简单,高效,无代码侵入性。随意扩展,灵活组装。
# 一,快速使用
我们接下来来演示如何使用超级业务链,来完成一个简单的业务流程。
这个业务流程就是判断一个字符串是否为空,且字符串必须以assistant开头,如果不符合则返回false。
# 1,引入依赖
注意
请确保项目中引入了assistant-boot-starter依赖
<dependency>
<groupId>io.github.geniusay</groupId>
<artifactId>assistant-service</artifactId>
<version>尽量boot-starter版本同步</version>
</dependency>
2
3
4
5
# 2,编写业务链
- 继承AbstractFilterChain,并明确需要输入的类型
- 将核心业务方法写入filter中
- 添加@Chain注解,声明该业务链的名称
@Chain("stringNotEmpty") //业务链名称
public class StringNotEmptyFilterChain extends AbstractFilterChain<String> {
//编写业务功能
@Override
public boolean filter(String value) {
return !StringUtils.isEmpty(value);
}
@Override
public List<ServicePoint> servicePoints() {
return null;
}
}
@Chain("startWithAssistant") //业务链名称
public class StringStartWithAssistantFilterChain extends AbstractFilterChain<String> {
//编写业务功能
@Override
public boolean filter(String value) {
return value.startsWith("assistant");
}
@Override
public List<ServicePoint> servicePoints() {
return null;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 3,构建业务链
在你的yaml文件下,组装业务链,格式如下:
业务名称:业务链名称->业务链名称
箭头之间不要有空格
assistant:
service-chain:
serviceMap:
string: stringNotEmpty->startWithAssistant
2
3
4
# 4,使用业务链
- 引入ServiceChainFactory类
- 调用get方法,根据业务名称,获取业务链引导类
- 传入需要执行的业务类,执行execute()
@Resource
private ServiceChainFactory factory;
@Test
public void testCommonChain(){
String str = "assistant12345";
boolean res = factory
.get("string") //根据业务名称,获取业务链引导类
.execute(str); //执行execute()
}
2
3
4
5
6
7
8
9
10
o( ̄▽ ̄)d 怎么样这就是整个的业务链的使用,是不是很简单优雅~,业务链的玩法还不止于此,你还可以接着往下看更多的功能。
#
# 二,组装业务流程链
在assistant中有多种业务链构建的方式,根自身需要你可以使用以下三种方法来构建你的业务链
# 1,yaml构建业务流程链(推荐)
构建业务链中最推荐的一种方式,这种方式可以更加直观灵活便捷的构建你的业务链,并且可以很方便的进行业务链的调试和维护。
格式如下:
assistant:
service-chain:
serviceMap:
业务名称: 业务链名称->业务链名称
2
3
4
# 2,使用servicePoint来构建业务流程链
在业务链编写时,可以通过重写servicePoints方法来预先指定该业务链在某业务中的位置
ServicePoint:
- serviceName:业务名称
- order:业务在业务链中的顺序,order值越小,排名越前
- isIgnore:是否忽视该业务链的结果,默认为false,即不忽视
@Chain("stringNotEmpty")
public class StringNotEmptyFilterChain extends AbstractFilterChain<String> {
@Override
public List<ServicePoint> servicePoints() {
return List.of(
new ServicePoint("hello",2), //在hello业务中,order值为2
new ServicePoint("world",5) //在world业务中,order值为5
);
}
}
2
3
4
5
6
7
8
9
10
11
# 3,自定义构建业务流程链
在开发中可以动态的根据已有的业务链构建新的业务链,并且可以动态的指定业务链的顺序 可以通过new 得到业务链,也可以通过factory.getChain("业务链名称")来获取业务链。
@Resource
private ServiceChainFactory factory;
@Test
public void testBuildChain(){
ServiceChainBootstrap bootstrap = factory.bootstrap()
.next(new ObjectNotEmptyFilterChain(), new StringNotEmptyFilterChain()) //指定多个业务链,按顺序指定
.next(factory.getChain("Exception"), true) //从工厂中根据业务链名称获取已有的业务链,指定业务链,并指定是否忽视该业务链的结果
.next(factory.getChain("taskCheck");
}
2
3
4
5
6
7
8
9
10
# 三,业务链引导类扩展功能
关于业务链的创建,使用,扩展,执行都是由业务链引导类 ServiceChainBootstrap
来引导完成的,用户只需构建自己的引导类即可一条龙的打造属于自己的业务链脚本
# 1,业务链参数适配器
一个业务流程中会有很多业务链,而每个业务链的参数类型可能不同,因此assistant提供了业务链参数适配器,用于将传入参数适配业务链的参数类型
例如:StringNotEmpty业务链传入的是String类型,TaskCheck业务链传入的是Task类型,要校验taskName不为空且TaskCheck通过,可以通过以下方式实现:
- 在
业务链引导类
中,配置supplierMap
,在前面需要声明传入的类型是什么 - 指定key,value
- key为Integer类型,代表着要适配的业务链的位置,从1开始
- value为适配方法,代表你要返回什么值给该位置业务链去使用
@Data
@AllArgsConstructor
public class TaskDO {
private Integer taskId;
private String taskName;
private String taskDescription;
}
@Test
public void testSupplierChain(){
TaskDO task = new TaskDO(12, "taskHello", "hello");
//业务task的链结构为 StringNotEmptyFilterChain -> TaskCheckFilterChain
ServiceChainBootstrap bootstrap = factory
.get("task")
.<TaskDO>supplierMap(
Map.of(1, TaskDO::getTaskName) //代表第一个链传入的参数为 TaskDO的taskName
);
System.out.println(bootstrap.execute(task));
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 2,业务链Callback机制
业务链的Callback机制,用于在业务链执行完毕后,执行一些回调操作
回调操作分为两种: successCallback
和failCallback
,顾名思义为成功回调和失败回调
- successCallback: 业务链执行成功后无异常,执行的回调操作
- failCallback: 业务链执行失败或抛出异常,即使被忽略结果也会执行的回调操作
他的接入和使用方式与业务链参数适配器类似,
业务链引导类
使用failCallbackMap与successCallbackMap来进行配置
ServiceChainBootstrap bootstrap = factory
.get("ignoreTaskException")
.returnType(ReturnType.THROW)
.<TaskDO>supplierMap(Map.of(1, TaskDO::getTaskName))
.failCallbackMap(Map.of( //构建第一条业务链执行失败后的回调方法
1, () -> System.out.println("taskName is empty")
))
.successCallbackMap(Map.of( //构建第一条业务链执行成功后的回调方法
1, () -> System.out.println("taskName not empty")
));
2
3
4
5
6
7
8
9
10
# 3,业务链返回模式切换
在业务链中我没可以选择将业务链中发生的异常给抛出或者返回结果值,能进行一个自由的切换
使用业务链引导类
的returnType
方法来进行配置,目前支持以下两种模式:
- ReturnType.THROW: 业务链中发生异常时,抛出异常
- ReturnType.BOOLEAN(默认): 业务链中发生异常时,返回结果值
ServiceChainBootstrap bootstrap = factory
.get("taskException")
.returnType(ReturnType.THROW) //返回模式为抛出异常
.<TaskDO>supplierMap(Map.of(1, TaskDO::getTaskName));
2
3
4
# 4,业务链忽略模式
对于一个业务链他的结果与否,是否异常,不进行处理。忽略掉业务链的结果接着往下执行
可以通过以下三种方法来设置某条业务链是否被忽略
- yaml: 在业务链配置文件中,对对应的业务链名称后加上
[ignore]
标签(大小写都🆗)
ignoreTaskException: stringNotEmpty->objectNotEmpty->taskCheck->Exception[ignore]
- servicePoint: 设置servicePoint的ignore属性为true
new ServicePoint("hello",5,true)
- ServiceChainBootstrap: 使用next方法时,将ignore属性设置为true
next(factory.getChain("Exception"), true)