Solon v3.7.3

statefulflow - 有状态计算应用示例

</> markdown
2025年12月5日 上午11:57:12

示例(两种接口使用对比)

public class NotBlockStateFlowDemo {
    NotBlockStateController stateController = new NotBlockStateController();
    InMemoryStateRepository stateRepository = new InMemoryStateRepository() {
        @Override
        public void statePut(FlowContext context, Node node, StateType state) {
            super.statePut(context, node, state);
            //todo: 打印放这儿,顺序更真实
            if (state == StateType.COMPLETED) {
                log.info("{} 完成", node.getId());
            }
        }
    };

    @Test
    public void useEval() {
        //计算后,不能获取最新状态

        FlowEngine flowEngine = FlowEngine.newInstance();
        Graph graph = getGraph();

        FlowContext context = FlowContext.of("5", stateController, stateRepository)
                .put("tag", "");

        flowEngine.eval(graph, context);
        System.out.println("--------------------");

        context = FlowContext.of("6", stateController, stateRepository)
                .put("tag", "n1");
        flowEngine.eval(graph, context);
        System.out.println("--------------------");

        //再跑(仍在原位、原状态)
        flowEngine.eval(graph, context);
        System.out.println("--------------------");


        context.put("tag", "n2");
        flowEngine.eval(graph, context);
        System.out.println("--------------------");

        context.put("tag", "");
        flowEngine.eval(graph, context);
        System.out.println("--------------------");
    }

    @Test
    public void useFlowStateful() {
        //计算后,可获取最新状态

        FlowEngine flowEngine = FlowEngine.newInstance();
        Graph graph = getGraph();

        FlowContext context = FlowContext.of("3", stateController, stateRepository)
                .put("tag", "");

        StateResult task = flowEngine.forStateful().getTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n3", task.getNode().getId());
        Assertions.assertEquals(StateType.COMPLETED, task.getState());

        context = FlowContext.of("4", stateController, stateRepository)
                .put("tag", "n1");

        task = flowEngine.forStateful().getTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n1", task.getNode().getId());
        Assertions.assertEquals(StateType.WAITING, task.getState());

        //再跑(仍在原位、原状态)
        task = flowEngine.forStateful().getTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n1", task.getNode().getId());
        Assertions.assertEquals(StateType.WAITING, task.getState());


        context.put("tag", "n2");

        task = flowEngine.forStateful().getTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n2", task.getNode().getId());
        Assertions.assertEquals(StateType.WAITING, task.getState());

        context.put("tag", "");

        task = flowEngine.forStateful().getTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n3", task.getNode().getId());
        Assertions.assertEquals(StateType.COMPLETED, task.getState());
    }

    private Graph getGraph() {
        String task = "if(tag.equals(node.getId())){exchanger.interrupt();}";

        Graph graph = Graph.create("tmp-" + System.currentTimeMillis(),decl->{
            decl.addStart("s").linkAdd("n0");
            decl.addActivity("n0").task(task).linkAdd("n1");
            decl.addActivity("n1").task(task).linkAdd("n2");
            decl.addActivity("n2").task(task).linkAdd("n3");
            decl.addActivity("n3").task(task).linkAdd("e");
            decl.addEnd("e");
        });

        return graph;
    }
}

打印样列

INFO 2025-08-17 17:33:40.711 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n0 完成
INFO 2025-08-17 17:33:40.712 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n1 完成
INFO 2025-08-17 17:33:40.712 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n2 完成
INFO 2025-08-17 17:33:40.712 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n3 完成
--------------------
INFO 2025-08-17 17:33:40.716 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n0 完成
--------------------
--------------------
INFO 2025-08-17 17:33:40.716 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n1 完成
--------------------
INFO 2025-08-17 17:33:40.717 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n2 完成
INFO 2025-08-17 17:33:40.717 #15134 [-main] features.flow.stateful.NotBlockStateFlowTest2#console: 
n3 完成
--------------------