Spring的轻量级工作流框架基础介绍

发布时间:2020-05-09 11:12:50 作者:Leah
来源:亿速云 阅读:496

今天小编给大家分享的是Spring的轻量级工作流框架基础介绍,相信大部分人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,话不多说,一起往下看吧。   

先通俗的介绍一下框架

该框架的灵感来自于现实中的公交系统。公交系统的中最重要的几个元素,及其对工作流框架的对应:

框架中的一些重要接口

BusContext

保存一个业务处理逻辑的上下文环境。

Bus

一个Bus是保存一次业务流程的上下文环境,业务的起始节点、抛异常的时候怎么处理等等。一个业务流都会新建一个bus,让后顺着一个一个节点进行处理。

Station

Station为一个业务流(处理链)中的一个单独的节点。这个节点应该是只依赖于Bus中的上下文环境,根据bus的上下文环境进行处理,并且把处理后的结果(如果有)也放入bus的上下文环境中,供下游的节点使用。 例如下面就是一个Station,从Bus上下文中获取maxValue和minValue,如果之间的差小于10则设置路由的key为OK(Routing根据这个进行路由)

Routing

由于Station之间并没有直接关联,因此Routing负责连接各个Station,每个Station都有一个Routing来负责处理bus到底哪个Station,即可以动态的决定Bus的下一个Station

如何使用

举例子

Station

一个Station就是一个Spring容器管理的Bean(实现了com.lizo.busflow.station.Station接口)。一个station应该是独立的,有一定通用性的业务处理类,例如一个参数检查器,ip控制或一个相对对立的业务逻辑等等。


public class GetDiff implements Station {    public void abstractCalculate(@BusParameter("maxValue") int a, @BusParameter("minValue") int b, Bus bus) {        if (Math.abs(a - b) < 10) {
            bus.setRoutingKey("ok");
        } else {
            bus.setRoutingKey("no");
        }
    }
    @Override    public String getName() {        return null;
    }
}


 

Routing

Routing的一定是要一个对应的Station的,例如可以在xml配置中,根据路由的key为进行选择下一个处理的Station


   <!--这个是一个Station-->
   <bean id="getDiff" class="com.lizo.demo.station.GetDiff"></bean>

    <!--这个是一个Routing,包含了对应的Station Bean-->
    <bf:stop id="getDiffStop" ref="getDiff" method="abstractCalculate">
        <bf:routing value="ok" to="soutOutOkStop"/>
        <bf:routing value="no" to="soutOutNoStop"/>
    </bf:stop>


 

注意,

Bus

一个完整Bus在xml中定义,如下:

<bf:bus id="testBus" start="findMaxStop" maxPath="1000"  exception="exceptionStation" finish="endStation" class="xxx.xxx.xxx.myBus"/>

其中:

看个DEMO

现在有一个业务需求,需要做以下处理

  1. 输入一个整型的list

  2. 找出最大值和最小值

  3. 如果最大值和最小值的差大于10输出“no”,否则输入“ok” 、 当然真实项目中的业务流程不会这么简单,只是这里使用这个做个例子

第一步 编写独立的Station

    <bean id="findMax" class="com.lizo.demo.station.FindMax"/>
    <bean id="findMin" class="com.lizo.demo.station.FindMin"/>
    <bean id="soutOutOk" class="com.lizo.demo.station.SoutOutOk"/>
    <bean id="soutOutNo" class="com.lizo.demo.station.SoutOutNo"/>
    <bean id="getDiff" class="com.lizo.demo.station.GetDiff">

 

例如getDiff的核心代码如下:


public class GetDiff implements Station {    public void abstractCalculate(@BusParameter("maxValue") int a, @BusParameter("minValue") int b, BusContext busContext) {        if (Math.abs(a - b) < 10) {
            busContext.setRoutingKey("ok");
        } else {
            busContext.setRoutingKey("no");
        }
    }

    @Override    public String getName() {        return null;
    }

}


 

把他们串起来吧


 <bf:stop id="findMaxStop" ref="findMax" method="doBusiness">
        <bf:routing to="findMinStop"/>
    </bf:stop>

    <bf:stop id="findMinStop" ref="findMin" method="doBusiness">
        <bf:routing to="getDiffStop"/>
    </bf:stop>

    <bf:stop id="getDiffStop" ref="getDiff" method="abstractCalculate">
        <bf:routing value="ok" to="soutOutOkStop"/>
        <bf:routing value="no" to="soutOutNoStop"/>
    </bf:stop>

    <bf:stop id="soutOutOkStop" ref="soutOutOk" method="printOk"/>

    <bf:stopid="soutOutNoStop"ref="soutOutNo"method="printNo"/>


 

创建一个bus,开车吧司机

<bf:bus id="testBus" start="findMaxStop" />

运行demo

public class DemoApplication {    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:bus-config.xml");

        Bus testBus = BusFactory.createNewBus("testBus");
        List<Integer> input = Arrays.asList(5, 7, 1, 0, 1, 3, 4, 5, 6, 4);
        testBus.putContext("intList", input);
        testBus.run();


        testBus = BusFactory.createNewBus("testBus");
        input = Arrays.asList(52, 7, 1, -10, 1, 3, 4, 5, 6, 4);
        testBus.putContext("intList", input);
        testBus.run();
    }
}

看完上诉内容,你们对Spring的轻量级工作流框架基础大概了解了吗?如果想了解更多相关文章内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. java快速开发框架工作流引擎介绍
  2. spring基础知识介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring spring基础 spring接口

上一篇:vue与react的区别是什么

下一篇:简单了解linux中MySQL的一些知识

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》