🌯数据上下文的定义和使用
# 默认上下文
LiteFlow提供了一个默认的数据上下文的实现:DefaultContext
。这个默认的实现其实里面主要存储数据的容器就是一个Map。
你可以通过DefaultContext
中的setData
方法放入数据,通过getData
方法获得数据。
建议
DefaultContext
虽然可以用,但是在实际业务中,用这个会存在大量的弱类型,存取数据的时候都要进行强转,颇为不方便。所以官方建议你自己去实现自己的数据上下文。
# 自定义上下文
你可以用你自己的任意的Bean当做上下文进行传入。LiteFlow对上下文的Bean没有任何要求。
自己定义的上下文实质上就是一个最简单的值对象,自己定义的上下文因为是强类型,更加贴合业务。
你可以像这样进行传入:
LiteflowResponse response = flowExecutor.execute2Resp("chain1", 流程初始参数, CustomContext.class);
传入之后, LiteFlow会在调用时进行初始化,给这个上下文分配唯一的实例。你在组件之中可以这样去获得这个上下文实例:
@LiteflowComponent("yourCmpId")
public class YourCmp extends NodeComponent {
@Override
public void process() {
CustomContext context = this.getContextBean(CustomContext.class);
//或者你也可以用这个方法去获取上下文实例,如果你只有一个上下文,那么和上面是等价的
//CustomContext context = this.getFirstContextBean();
...
}
}
关于组件之中还可以获得哪些默认的参数,请参考普通组件。
# 多上下文v2.8.0+
LiteFlow在新版本中支持了多上下文,在执行的时候同时初始化你传入的多个上下文。在组件里也可以根据class类型很方便的拿到。
你可以像这样进行传入(看不全的可以往后拉):
LiteflowResponse response = flowExecutor.execute2Resp("chain1", 流程初始参数, OrderContext.class, UserContext.class, SignContext.class);
在组件之中可以这样去获得这个上下文实例:
@LiteflowComponent("yourCmpId")
public class YourCmp extends NodeComponent {
@Override
public void process() {
OrderContext orderContext = this.getContextBean(OrderContext.class);
UserContext userContext = this.getContextBean(UserContext.class);
SignContext signContext = this.getContextBean(SignContext.class);
//如果你只想获取第一个上下文,第一个上下文是OrderContext,那么也可以用这个方法
//OrderContext orderContext = this.getFirstContextBean();
...
}
}
# 利用超类获取上下文v2.12.2+
从上面的例子可以得知,获取上下文可以通过对象的class来取到。
但是在有些场景中,尤其是要定义一些通用组件的时候。用特定对象的class来取就有些不合适了。这就显得不是很通用。
为了适配通用组件这个场景。LiteFlow支持了利用超类来获得上下文。
例如,你定义了一个OrderContext
:
public class OrderContext extends BaseContext{
...
}
调用的时候:
flowExecutor.execute2Resp("chain1", 流程初始参数, OrderContext.class);
那么你在某些通用组件里可以通过它的超类BaseContext
类型来获取到上下文:
@LiteflowComponent("yourCmpId")
public class YourCmp extends NodeComponent {
@Override
public void process() {
CustomContext context = this.getContextBean(BaseContext.class);
...
}
}
提示
如果在一个链路请求中有多个上下文,并且都是某一个超类的子类,你再用超类去获取,只会获取到第一个上下文。这点请注意。
# 利用别名获取上下文v2.12.0+
关于这个特性请参考给上下文设置别名章节。