hero

流程编排框架、并发框架、微服务业务整合框架

使用场景→

业务可视

编排好的图示模型即为代码真实的执行链路,以所见即所得的方式在技术和业务之间架起一道通用语言的桥梁

动态配置

主流程、子流程、角色、变量等支持动态化配置,支持包括开源和公司自研在内的全部存储介质

业务抽象

引入资源、权限、角色等概念,构建定制化业务身份,为抽象化业务能力提供技术支持和解决方案

# 快速开始

# 1、配置引入

<dependency>
    <groupId>cn.kstry.framework</groupId>
    <artifactId>kstry-core</artifactId>
    <version>1.1.10</version>
</dependency>
1
2
3
4
5

# 2、项目引入

@EnableKstry(bpmnPath = "./bpmn/*.bpmn")
@SpringBootApplication
public class KstryDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(KstryDemoApplication.class, args);
    }
}
1
2
3
4
5
6
7
8

# 3、编写组件代码

@TaskComponent
public class GoodsService {
    
    @NoticeResult
    @TaskService
    public GoodsDetail initBaseInfo(@ReqTaskParam(reqSelf = true) GoodsDetailRequest request) {
        return GoodsDetail.builder().id(request.getId()).name("商品").build();
    }
}

@Data
public class GoodsDetailRequest{
    private long id;
}

@Data
@Builder
public class GoodsDetail{
    private long id;
    private String name;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 4、定义bpmn配置文件

# 方式一:BPMN配置文件定义流程

TIP

BPMN文件(流程图文件)流程配置地址:Kstry流程配置台 (opens new window)

image-20211211151733111

# 方式二:代码定义流程

TIP

如果没有BPMN配置文件,全部是代码定义流程时,@EnableKstry 注解的 bpmnPath 参数可以为空

@Configuration
public class ProcessDiagramConfiguration {
    
    @Bean
    public ProcessLink buildShowGoodsLink() {
        StartProcessLink bpmnLink = StartProcessLink.build(ProcessDiagramConfiguration::buildShowGoodsLink, "展示商品详情");
        bpmnLink.nextService(GoodsService::initBaseInfo).end();
        return bpmnLink;
    }
}
1
2
3
4
5
6
7
8
9
10

# 5、调用执行

@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Resource
    private StoryEngine storyEngine;

    @PostMapping("/show")
    public GoodsDetail showGoods(@RequestBody GoodsDetailRequest request) {

        StoryRequest<GoodsDetail> req = ReqBuilder.returnType(GoodsDetail.class).startProcess(ProcessDiagramConfiguration::buildShowGoodsLink).request(request).build();
        TaskResponse<GoodsDetail> fire = storyEngine.fire(req);
        if (fire.isSuccess()) {
            return fire.getResult();
        }
        return null;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18