Solon v3.5.1

flow - 流上下文的作用(FlowContext)

</> markdown

流上下文(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");
    }
}