JAVA工作流的优雅实现方式

article/2025/9/30 8:35:00

今天查找线上问题,看到一个让我脑洞大开的工作流实现方式。以前用过责任链模式,也用过模板模式实现类工作流的方式,但是对比这个工具,逊色不少,不卖关子了,就是Apache Commons Chain,它是Command模式与责任链模式的综合体。

1

Apache Commons Chain 中的角色有:chain、context、command。



2

在我们订单系统有这样的业务,就是退票的时候,会根据核损后的订单价格,给客人退钱,但是订单的金额,由几部分组成

有现金、商旅卡、有优惠券。所以根据需求,我们需要一个工作流来走下退款流程,我们的流程流转的步骤是这样的:

先退商旅卡-----如果还有余额退现金-----------还有余额再退优惠券,分析一下这样的需求,刚好可以用这个工具,直接上代码了


先引入包

 <dependency><groupId>commons-chain</groupId><artifactId>commons-chain</artifactId><version>1.2</version></dependency>


编写command

/*** 退商旅卡Cash* Created by 一代天骄 on 2018/7/1.*/
@Slf4j
public class RefundBusinessCardCommand implements Command{public boolean execute(Context context) throws Exception {RefundContext refundContext = (RefundContext) context;log.info("orderId:{} 退款开始,第一步:退商旅卡,金额:{}",refundContext.getOrderId(),"10");return false;}
}

/*** 退现金* Created by 一代天骄 on 2018/7/1.*/
@Slf4j
public class RefundCashCommand implements Command {public boolean execute(Context context) throws Exception {RefundContext refundContext = (RefundContext) context;log.info("orderId:{}退款开始,第二步:退现金,金额:{}",refundContext.getOrderId(),"5");return false;}
}

/*** 退优惠券* Created by 一代天骄 on 2018/7/1.*/
@Slf4j
public class RefundPromotionCommand implements Command{public boolean execute(Context context) throws Exception {RefundContext refundContext = (RefundContext) context;log.info("orderId:{} 退款开始,第二步:退优惠券,金额:{}",refundContext.getOrderId(),"20");return false;}
}
 * Created by 一代天骄 on 2018/7/1.*/
@Data
public class RefundContext extends ContextBase {/*** 订单号*/private Integer orderId;}
/**** 退票的工作流实现* Created by  一代天骄 on 2018/7/1.*/
public class RefundTicketChain extends ChainBase {public void init() {//退商旅卡this.addCommand(new RefundBusinessCardCommand());//退现金this.addCommand(new RefundCashCommand());//退优惠券this.addCommand(new RefundPromotionCommand());}public static void main(String[] args) throws Exception {RefundTicketChain refundTicketChain = new RefundTicketChain();refundTicketChain.init();RefundContext context = new RefundContext();context.setOrderId(1621940242);refundTicketChain.execute(context);}
}





http://chatgpt.dhexx.cn/article/u4RZmVs3.shtml

相关文章

Java开源工作流引擎

http://www.open-open.com/08.htm Willow 由Huihoo Power开发详细可到其中文主页查看。 更多Willow信息 OpenWFE OpenWFE是一个开放源码的Java工作流引擎。它是一个完整的业务处理管理套件&#xff1a;一个引擎&#xff0c;一个工作列表&#xff0c;一个Web界面和一个反应器&…

Java工作流管理系统(activity6.0)

activity6.0工作流系统知识点文章 第一章 activity流程部署&#xff08;自动部署与动态BPMN部署&#xff09; 第二章 activity变量使用 第三章 activity权限控制&#xff08;代办任务查询&#xff09; 第四章 activity审核任务&#xff08;签领、完成任务、跳过节点、新增节点…

JAVA实现一个工作流引擎

介绍 工作流是一种将一系列相关的任务和活动组织起来的技术&#xff0c;以便在企业或组织中自动化或半自动化地管理业务流程。工作流技术可以帮助企业或组织更好地管理和优化业务流程&#xff0c;提高生产效率和质量&#xff0c;降低成本和风险。 JAVA作为一种面向对象编程语…

Java 3个常用工作流引擎

一&#xff1a;Java工作流框架是一种用于设计、执行和管理工作流程的技术。以下是几个常见的Java工作流框架&#xff1a; Activiti&#xff1a;Activiti是一款流行的开源Java工作流引擎&#xff0c;它基于BPMN 2.0标准&#xff0c;支持复杂的工作流程设计和管理。Activiti具有高…

Java 流行的工作流引擎

Java 流行的工作流引擎 JBPM 工作流 JBPM 是一个Java业务流程管理系统&#xff0c;是JBoss中一款开源的工作流引擎&#xff0c;是一个轻量级的&#xff0c;使用BPMN 2规范可扩展的 工作流引擎&#xff0c;也是一个工作流管理系统&#xff0c;它可以运行在任何java环境&#x…

Java工作流有哪些?如何快速掌握Java技术

工作流是什么?工作流是指两个或两个以上的人&#xff0c;为了共同的目标&#xff0c;连续的以串行或并行的方式去完成某一业务。Java工作流就是一个基于Java开发的流程框架&#xff0c;是每一个参加郑州Java软件开发培训的学员需要掌握的入门知识。那么常见的Java工作流有哪些…

JAVA工作流

一、 什么是工作流 以请假为例&#xff0c;现在大多数公司的请假流程是这样的 员工打电话&#xff08;或网聊&#xff09;向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作流技术的公司的请假流程是这样…

java工作流详解

什么是工作流&#xff1f; 工作流&#xff1a;两个或两个以上的人&#xff0c;为了共同的目标&#xff0c;连续的以串行或并行的方式去完成某一业务。 业务&#xff1a;工作流所指业务涵盖了与经营相关的活动。 串行或并行&#xff1a;业务中的步骤也许以一步接着一步的方式…

Java开源工作流框架对比

什么是工作流&#xff1f; 工作流&#xff0c;是指“业务​过程的部分或整体在​计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。 在计算机中&#xff0c;工作流属于计算机支持的协同工作&#xff08;CSCW&#xff09;的一部分。 工作流…

极简 Java 工作流概念入门

1. 为什么需要工作流 假设我有一个请假需求&#xff0c;流程如下&#xff1a; 请假可以提交给我的上司&#xff0c;上司可以选择批准或者拒绝&#xff0c;无论批准还是拒绝&#xff0c;都会给我一个通知。 这个流程比较简单&#xff0c;我们很容易想到解决方案&#xff0c;不…

Java工作流详解(附6大工作流框架对比)

目录 1.什么是工作流 2.工作流应用场景 3.工作流实现方式 4.有哪些工作流框架? 5.1.Activiti6. 2.Flowable7. 3.Camunda8.4.jBPM9. 5.osworkflow&#xff0c;6.jflow. 10.工作流框架对比 什么是工作流工作流(Worklow) 工作流是对工作流程及其各操作步骤之间业务规则的…

smalldatetime类型

1、MS Sql Server 的smalldatetime 与datetime类型的区别 原来数据库字段为smalldatetime类型&#xff0c; update table set column 11:59:30 发现commit后db中的值为12:00:00 update table set column 11:59:29 发现commit后db中的值为11:59:00 原来smalldatetime是不存储秒…

SQL Server中smalldatetime的日期范围为何是[1900-01-01,2079-06-06]

本文目录列表&#xff1a; 1、SQL Server中的基准日期 2、smalldatetime的日期范围 3、smalldatetime的日期范围和无符号2字节整数的关系 4、总结语 5、参考清单列表 SQL Server中的基准日期 SQL Server 中针对datetime和smalldatetime这两个日期时间数据类型提供一个基准日期&…

smalldatetime mysql_SQL 中 date 与datetime的区别

潇潇雨雨 我们看看这几个数据库中(mysql、oracle和sqlserver)如何表示时间mysql数据库&#xff1a;它们分别是 date、datetime、time、timestamp和year。date &#xff1a;“yyyy-mm-dd”格式表示的日期值 time &#xff1a;“hh:mm:ss”格式表示的时间值 datetime&#xff1a;…

SQL datetime和smalldatetime区别

datetime 存储大小8个字节&#xff0c;精确到分后的3为小数&#xff0c;日期范围从1753 年 1 月 1 日到 9999 年 12 月 31 日&#xff1b;而 smalldatetime存储大小为4个字节&#xff0c;精确到分&#xff0c;日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日。 参考 http://m…

170406回顾-SQL Server的smalldatetime类型比较

在比较SQL Server的类型为smalldatetime字段时出现下面的错误:将 expression 转换为数据类型 smalldatetime 时出现算术溢出错误 正确的比较方法如下:将long型转换为时间格式的字符串,再与smalldatetime类型的字段比较 SELECT * FROM tablename WHERE EditFlag > 2017/…

【SQL Server】将字符串转换为 smalldatetime 数据类型时失败

如下图&#xff0c;我在执行下列语句时遇到了“将字符串转换为 smalldatetime 数据类型时失败”的报错 然后去搜了一下&#xff0c;原来是存储过程的问题,我看的是其他博主的解答&#xff08;但是还没有按照博主的方法实践过&#xff09;&#xff0c;内容详情有需要的自己去搜一…

android笔记1(activity跳转)

1.利用Android studio创建一个新项目&#xff0c;项目结构如下。 2.创建一个新的activity&#xff0c;用于跳转。 3.修改两个activity的布局&#xff0c;主activity中有一个输入文本框和一个按钮&#xff0c;实现点击按钮发送文本框的内容到第二个activity。第二个activity中有…

Activity 跳转的生命周期变化

1&#xff09;Activity1跳转到Activity2的生命周期流程 1.Activity1启动&#xff1a;Activity1: onCreate()Activity1: onStart()Activity1: onResume()2.点击按钮跳转到Activity2:Activity1: onPause()Activity2: onCreate()Activity2: onStart()Activity2: onResume()Activit…

android activity跳转生命周期,Android中从一个Activity跳转到另一个Activity所经历的生命周期........

凡是Android开发人员都知道“Activity”是非常重要的&#xff1b;对其该“Activity”生命周期相信大家也比较熟悉了。 这篇文章主要探讨的是“从一个Activity启动跳转到另一个Activity中&#xff0c;所经历的生命周期中的过程” 实例&#xff1a; 1、MainActivity 启动 Secon…