一、项目概述

1.原项目github地址:https://github.com/j-easy/easy-flows.git

2.easy-flows可以用非常简易的api创建常用的可组合的工作流。涵盖了四种逻辑的处理:

3.可以用如下方式构造循环工作流:

  1. RepeatFlow repeatFlow = RepeatFlow.Builder.aNewRepeatFlow()
  2. .named("repeatflow")
  3. .repeat(work)
  4. .until(WorkPredicate.ALWAYS_FALSE)
  5. .build();

二、项目亮点

由于项目代码量小,决定手写一下慢慢品。个人感觉,easy-flows最好玩的地方在于Builder的构造。通过在Builder模式中进一步定义接口,细化了流程中的语义和步骤哦。

拿比较简单的顺序流SequentialFlow举例,通过ExecuteStep接口中的execute方法返回ThenStep。限制了链式调用过程中的then()方法在execute()之后。

  1. public static class Builder {
  2. private Builder() {
  3. // force usage of static method aNewSequentialFlow
  4. }
  5. public static NameStep aNewSequentialFlow() {
  6. return new BuildSteps();
  7. }
  8. public interface NameStep extends ExecuteStep {
  9. ExecuteStep named(String name);
  10. }
  11. public interface ExecuteStep {
  12. ThenStep execute(Work initialWork);
  13. ThenStep execute(List<Work> initialWorkUnits);
  14. }
  15. public interface ThenStep {
  16. ThenStep then(Work nextWork);
  17. ThenStep then(List<Work> nextWorkUnits);
  18. SequentialFlow build();
  19. }
  20. private static class BuildSteps implements NameStep, ExecuteStep, ThenStep {
  21. private String name;
  22. private final List<Work> works;
  23. BuildSteps() {
  24. this.name = UUID.randomUUID().toString();
  25. this.works = new ArrayList<>();
  26. }
  27. ……
  28. @Override
  29. public SequentialFlow build() {
  30. return new SequentialFlow(this.name, this.works);
  31. }
  32. }

调用时如下:

  1. SequentialFlow sequentialFlow = SequentialFlow.Builder.aNewSequentialFlow()
  2. .named("testFlow")
  3. .execute(work1)
  4. .then(work2)
  5. .then(work3)
  6. .build();

三、关于Mockito

1.Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试.

2.使用 Mockito 的大致流程如下:

  • 创建外部依赖的 Mock 对象, 然后将此 Mock 对象注入到测试类中.
  • 执行测试代码.
  • 校验测试代码是否执行正确.

3.Mockito 会追踪 Mock 对象的所用方法调用和调用方法时所传递的参数. 我们可以通过 verify() 静态方法来来校验指定的方法调用是否满足断言.

  1. Mockito.verify(work, Mockito.times(n)).execute(workContext);

验证execute方法是否执行了n次;

  1. Mockito.verify(nextOnPredicateSuccess, Mockito.times(1)).execute(workContext);

验证nextOnPredicateSuccess.execute()是否执行了1次;

  1. Mockito.verify(nextOnPredicateFail, Mockito.never()).execute(workContext);

验证nextOnPredicateFail是否一次都没执行。

四、gitee地址

我的gitee地址: https://gitee.com/cathychen00/cathyjava-easyflows

我的文章会逐步公布到公众号,欢迎园友关注交流:

easy-flows源码研习的更多相关文章

  1. EasyMvc--让MVC区域开发更Easy(提供源码下载)

    核心: 主要利用MVC的区域功能,实现项目模块独立开发和调试. 目标: 各个模块以独立MVC应用程序存在,即模块可独立开发和调试. 动态注册各个模块路由. 一:新建解决方案目录结构 如图: 二:Eas ...

  2. 个人学习-STL深入学习01-vectory源码研习 // 需要补充

    参考资料: [1]博主:一枚程序员 STL源码剖析--vector https://www.cnblogs.com/sooner/p/3273395.html [2]博主:劲蜡鸡腿堡 vector源码 ...

  3. 在Myeclipse中查看android源码就是这么easy

    在开发android 时不能查看源码必是很不爽的一件事,看过网上一些文章后(都是2.0以前的版本,跟我的2.2最新版本的配置是不一样的)不过还是给了我启示,通过配置终于可以在myeclipse中查看源 ...

  4. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  5. Netty源码分析之服务端启动过程

    一.首先来看一段服务端的示例代码: public class NettyTestServer { public void bind(int port) throws Exception{ EventL ...

  6. YII 的源码分析(二)

    上一篇简单分析了一下yii的流程,从创建一个应用,到屏幕上输出结果.这一次我来一个稍复杂一点的,重点在输出上,不再是简单的一行"hello world",而是要经过view(视图) ...

  7. [dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)

    对例子IP Fragmentation的熟悉,使用,以及源码分析. 功能: 该例子的功能有二: 一: 将IP分片? 二: 根据路由表,做包转发. 路由表如下: IP_FRAG: Socket : ad ...

  8. 2014年7月份第2周51Aspx源码发布详情

      体育馆综合会员管理系统源码  2014-7-11 [VS2010]功能介绍:本系统适用于羽毛球馆,台球馆,乒乓球馆,棋牌室,篮球馆等综合体育馆,可同时使用.本系统功能非常强大,包含体育馆内餐厅,超 ...

  9. Google Tensorflow 源码编译(二):Bazel<v0.1.0>

    这几天终于把tensorflow安装上了,中间遇到过不少的问题,这里记录下来.供大家想源码安装的参考. 安装环境:POWER8处理器,Docker容器Ubuntu14.04镜像. Build Baze ...

随机推荐

  1. 京东数科面试真题:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?

    本文节选自<Java面试进阶指北 打造个人的技术竞争力> 面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平. IO 模型这块确实挺难理解的,需要太多计 ...

  2. apktool 回编译报错:No resource identifier found for attribute 'xxxxxx' in package 'android' W:

    C:\xxxx\app-release\res\layout-v26\xxxx.xml:5: error: No resource identifier found for attribute 'xx ...

  3. 清明|TcaplusDB持续为您保驾护航

    清明将至,又到一年休闲踏青,祭拜祖先的时机. 清明假期期间,TcaplusDB不停歇,我们将一如既往地守护您的数据,继续做您最坚实的后盾.  在未来,TcaplusDB还将以国产键值型数据库领航者的身 ...

  4. PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642 题目描述: "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大 ...

  5. HTTP2和 HTTPS来不来了解一下?

    本文力求简单讲清每个知识点,希望大家看完能有所收获 一.HTTP协议的今生来世 最近在看博客的时候,发现有的面试题已经考HTTP/2了,于是我就顺着去了解一下. 到现在为止,HTTP协议已经有三个版本 ...

  6. 201871030107-常雅伦 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming).2.掌握Github协作开发程 ...

  7. [C++]变量声明与定义的规则

    声明与定义分离 Tips:变量能且仅能被定义一次,但是可以被多次声明. 为了支持分离式编译,C++将定义和声明区分开.其中声明规定了变量的类型和名字,定义除此功能外还会申请存储空间并可能为变量赋一个初 ...

  8. JDK8之后,在java语言这条路怎么走?

    前言 自2017年9月以来,Oracle按照免费的开源许可证(类似于Linux的许可证)提供JDK版本 .从Java SE 11(2018年9月,LTS)开始,Oracle不仅为开源许可下的所有用户免 ...

  9. Day05_22_实例化对象的JVM内存分析

    创建对象的 JVM 内存分析 *new 运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 *方法区内存:在类加载的时候,class字节码文件被加载到该内存空间当中 *栈内存(局部变量):方法代 ...

  10. PTA沈师数据库原理——DB(10)_SQL实验题

    R10-1 A1-3查询顾客表中所有不重复的城市 (2 分) select distinct Cityfrom customersR10-2 查询学生表所有学生记录 (2 分) select * fr ...