zoukankan      html  css  js  c++  java
  • easy-flows源码研习

    一、项目概述

    1.原项目github地址:https://github.com/j-easy/easy-flows.git
    2.easy-flows可以用非常简易的api创建常用的可组合的工作流。涵盖了四种逻辑的处理:

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

    RepeatFlow repeatFlow = RepeatFlow.Builder.aNewRepeatFlow()
                    .named("repeatflow")
                    .repeat(work)
                    .until(WorkPredicate.ALWAYS_FALSE)
                    .build();
    

    二、项目亮点

    由于项目代码量小,决定手写一下慢慢品。个人感觉,easy-flows最好玩的地方在于Builder的构造。通过在Builder模式中进一步定义接口,细化了流程中的语义和步骤哦。
    拿比较简单的顺序流SequentialFlow举例,通过ExecuteStep接口中的execute方法返回ThenStep。限制了链式调用过程中的then()方法在execute()之后。

    public static class Builder {
    
            private Builder() {
                // force usage of static method aNewSequentialFlow
            }
    
            public static NameStep aNewSequentialFlow() {
                return new BuildSteps();
            }
    
            public interface NameStep extends ExecuteStep {
                ExecuteStep named(String name);
            }
    
            public interface ExecuteStep {
                ThenStep execute(Work initialWork);
                ThenStep execute(List<Work> initialWorkUnits);
            }
    
            public interface ThenStep {
                ThenStep then(Work nextWork);
                ThenStep then(List<Work> nextWorkUnits);
                SequentialFlow build();
            }
    
            private static class BuildSteps implements NameStep, ExecuteStep, ThenStep {
    
                private String name;
                private final List<Work> works;
                
                BuildSteps() {
                    this.name = UUID.randomUUID().toString();
                    this.works = new ArrayList<>();
                }
                
                ……
    
                @Override
                public SequentialFlow build() {
                    return new SequentialFlow(this.name, this.works);
                }
            }
    

    调用时如下:

    SequentialFlow sequentialFlow = SequentialFlow.Builder.aNewSequentialFlow()
                    .named("testFlow")
                    .execute(work1)
                    .then(work2)
                    .then(work3)
                    .build();
    

    三、关于Mockito

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

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

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

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

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

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

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

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

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

    四、gitee地址

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

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

    作者:陈敬(Cathy)
    出处:http://www.cnblogs.com/janes/
    博客文章仅供交流学习,请勿用于商业用途。如需转载,请务必注明出处。

  • 相关阅读:
    SSD论文优秀句子
    A Case Study -- Performance Evaluation of a DRAM-Based Solid State Disk
    A Case for Flash Memory SSD in Enterprise Database Applications
    Understanding Manycore Scalability of File Systems
    slabs.c
    背包九讲
    redis async client 与自有框架集成
    同步git修改文件到远端服务器脚本
    服务发现:Zookeeper vs etcd vs Consul
    Linux 常用工具贴
  • 原文地址:https://www.cnblogs.com/janes/p/14764489.html
Copyright © 2011-2022 走看看