在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:business-flow-parent开源软件地址:https://gitee.com/null_584_3382/business-flow-parent开源软件介绍:项目地址
先通俗的介绍一下框架该框架的灵感来自于现实中的公交系统。公交系统的中最重要的几个元素,及其对工作流框架的对应:
框架中的一些重要接口BusContext保存一个业务处理逻辑的上下文环境。 Bus一个Bus是保存一次业务流程的上下文环境,业务的起始节点、抛异常的时候怎么处理等等。一个业务流都会新建一个bus,让后顺着一个一个节点进行处理。 StationStation为一个业务流(处理链)中的一个单独的节点。这个节点应该是只依赖于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; }} RoutingRouting的一定是要一个对应的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现在有一个业务需求,需要做以下处理
第一步 编写独立的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:stop id="soutOutNoStop" ref="soutOutNo" method="printNo"/> 创建一个bus,开车吧司机<bf:bus id="testBus" start="findMaxStop" /> 运行demopublic 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(); }} |
请发表评论