Solon v3.8.3

示例1: claimTask 或 findTask 示例

</> markdown
2026年1月13日 下午7:03:19

通过对比,加深了解。

1、基础示例

claimTask(匹配权限) 或 findTask(不需要权限)一般用于审批场景。下面的示例一般没必要,这里使用 findTask 只作展示。

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.noear.solon.flow.FlowContext;
import org.noear.solon.flow.FlowEngine;
import org.noear.solon.flow.Graph;
import org.noear.solon.flow.Node;
import org.noear.solon.flow.workflow.TaskState;
import org.noear.solon.flow.workflow.Task;
import org.noear.solon.flow.workflow.controller.NotBlockStateController;
import org.noear.solon.flow.workflow.repository.InMemoryStateRepository;
import org.noear.solon.flow.workflow.WorkflowExecutor;

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

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

        WorkflowExecutor workflow = WorkflowExecutor.of(FlowEngine.newInstance(), stateController, stateRepository);
        Graph graph = getGraph();

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

        Task task = workflow.findTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n3", task.getNode().getId());
        Assertions.assertEquals(TaskState.COMPLETED, task.getState());

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

        task = workflow.findTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n1", task.getNode().getId());
        Assertions.assertEquals(TaskState.WAITING, task.getState());

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


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

        task = workflow.findTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n2", task.getNode().getId());
        Assertions.assertEquals(TaskState.WAITING, task.getState());

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

        task = workflow.findTask(graph, context);
        System.out.println("--------------------");
        Assertions.assertNotNull(task);
        Assertions.assertEquals("n3", task.getNode().getId());
        Assertions.assertEquals(TaskState.COMPLETED, task.getState());
    }

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

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

        return graph;
    }
}

打印样列

INFO 2026-01-13 19:01:17.173 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n0 完成
INFO 2026-01-13 19:01:17.173 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n1 完成
INFO 2026-01-13 19:01:17.173 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n2 完成
INFO 2026-01-13 19:01:17.174 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n3 完成
--------------------
INFO 2026-01-13 19:01:17.178 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n0 完成
--------------------
--------------------
INFO 2026-01-13 19:01:17.179 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n1 完成
--------------------
INFO 2026-01-13 19:01:17.179 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n2 完成
INFO 2026-01-13 19:01:17.179 #52042 [-main] demo.workflow.NotBlockStateFlowDemo#console: 
n3 完成
--------------------