flow - 流上下文的作用(FlowContext)
流上下文(FlowContext),主要做为流程执行的参数使用(不支持直接序列化)。同时提供了实例级的事件总线支持。
作用1:数据输入输出
对应字段或方法 | 描述 |
---|---|
context.model() | 提供多数据输入输出支持(在脚本中,可直接使用字段) |
context.put(key, value) | model 的快捷方法 |
context.putIfAbsent(key, value) | model 的快捷方法 |
context.putAll(map) | model 的快捷方法 |
context.computeIfAbsent(key, mappingFunction) | model 的快捷方法 |
context.get(key) | model 的快捷方法(返回 Object) |
context.getAs(key) | model 的快捷方法(返回 T,由接收类型决定)。v3.5.0 后支持 |
context.getOrDefault(key, def) | model 的快捷方法 |
context.remove(key) | model 的快捷方法 |
context.incrAdd(key, delta) | model 的快捷方法(增量添加)。v3.4.1 后支持 |
context.incrGet(key) | model 的快捷方法(增量获取)。v3.4.1 后支持 |
作用:
- 给流处理输入变量
- 在节点处理之间传递变量(例如:一个节点的处理结果作为变量,后一个节点可使用)
应用示例1:(给流处理输入变量)
#c1.chain.yml
id: c1
layout:
- task: 'if(a > 0){context.put("result", 1);}'
FlowContext context = FlowContext.of();
context.put("a",2);
flowEngine.eval(c1,context);
System.out.println(context.get("result")); //打印执行结果
应用示例2:(在节点处理之间传递变量)
#c1.chain.yml
id: c1
layout:
- task: |
context.put("a", 1); context.put("b", 2);
- task: |
context.put("c", (a + b)); //可以直接使用变量,可者通过 (int)context.get("a") 获取
作用2:是否有状态识别与控制
(v3.5.0 后支持)
对应字段或方法 | 描述 |
---|---|
context.getInstanceId() | 获取实例ID |
context.isStateful() | 是否有状态 |
context.statefulSupporter() | 有状态的支持接口 |
//无状态上下文
FlowContext context = FlowContext.of();
//有状态上下文
FlowContext context = FlowContext.of("instance-1", stateController, stateRepository);
//有状态上下文的定制
public class FlowContextImpl extends AbstractFlowContext implements StatefulSupporter {
...
}
作用3:并行计算控制
对应字段或方法 | 描述 |
---|---|
context.executor() | 获取执行线程池(默认为 null) |
context.executor(executor) | 配置执行线程池 |
当有执行线程池时(默认为 null),parallel
网关将采用多线程运行(并行计算)
作用4:广播事件(基于大米事件总线 - DamiBus)
(v3.1.3 后支持)基于流上下文(FlowContext)的事件总线。可以在流执行中广播事件
对应字段或方法 | 描述 |
---|---|
context.eventBus() | 事件总线 |
context.<String,String>eventBus() | 支持泛型(类型按需指定,不指定时为 object) |
流配置中的应用示例:
id: event1
layout:
- task: '@DemoCom'
- task: 'context.<String,String>eventBus().send("demo.topic", "hello");'
代码执行中的应用示例:
public class DemoController {
...
public void test(){
FlowContext context = FlowContext.of();
context.<String,String>eventBus().listen("demo.topic", event -> {
System.out.println(event.getContent());
});
flowEngine.eval("event1", context);
}
}
@Component
public static class DemoCom implements TaskComponent {
@Override
public void run(FlowContext context, Node node) throws Throwable {
context.<String, String>eventBus().send("demo.topic", "hello-com");
}
}