java工作流_Java 实现简单工作流

java工作流_Java 实现简单工作流工作流主要运用到反射机制创建一张工作流表如:主键|工作流Code|工作流内容其中工作流,内容为Json格式工作流内容如下{“procCode”:”OPS”,”procName”:”c端补齐(乘客信息补全)”,”taskControlVoList”:[{“sortNo”:”10″,”taskCode”:”OPC”,”taskName”:”检查对应的订单信息是否存在”,”taskl…

大家好,又见面了,我是你们的朋友全栈君。

工作流主要运用到反射机制

创建一张工作流表

如:主键 | 工作流Code | 工作流内容

其中工作流,内容为Json格式

工作流内容如下

{

“procCode”: “OPS”,

“procName”: “c端补齐(乘客信息补全)”,

“taskControlVoList”: [

{

“sortNo”: “10”,

“taskCode”: “OPC”,

“taskName”: “检查对应的订单信息是否存在”,

“tasklassName”: “com.xf.flow.service.impl.OrderPeople10ServImpl”

},

{

“sortNo”: “20”,

“taskCode”: “OPD”,

“taskName”: “乘客数据库落库”,

“tasklassName”: “com.xf.flow.service.impl.OrderPeople20ServImpl”

},

{

“sortNo”: “90”,

“taskCode”: “RSP”,

“taskName”: “响应消息”,

“tasklassName”: “com.xf.flow.service.impl.ApiResponseServImpl”

}

]

}

3.java代码现根据工作流的Code 获取当前的工作流

4.jsonStr ————>JsonObject————>获取taskControlVoList

5.java的工作流代码

@Override

public ApiResponse deal(String itemNo, Object objVo, String skey, InnerVo innerVo) {

ApiResponse apiResponse = new ApiResponse();

//查询itemNo获取流程实例

ProcControlVo procControlVo = codeLibraryDao.queryProcConfig(itemNo);

if (procControlVo == null) {

return new ApiResponse(ResponseCodeEnums.stream_no_exist);

}

List taskControlVoList = procControlVo.getTaskControlVoList();

taskControlVoList.sort((TaskControlVo h1, TaskControlVo h2) -> h1.getSortNo().compareTo(h2.getSortNo()));

Iterator itTask = taskControlVoList.iterator();

//初始化内部数据表

String dataNo = taskManagerServ.initData(itemNo,skey,innerVo);

//循环依次执行流程任务

String taskNo = null;

while (itTask.hasNext()){

TaskControlVo taskControlVo = itTask.next();

String taskClassName = taskControlVo.getTasklassName();

String taskItemNo = taskControlVo.getTaskCode();

String taskName = taskControlVo.getTaskName();

try {

//初始化任务

taskNo = taskManagerServ.initTask(taskItemNo,dataNo,innerVo);

//执行任务

TaskServ taskServ = (TaskServ) SpringFactory.getBean(Class.forName(taskClassName));

taskServ.init(taskNo,objVo);

TaskAnswerVo taskAnwserVo = taskServ.deal(taskNo,objVo);

//判断任务执行结果

apiResponse = taskAnwserVo.getApiResponse();

if(StringUtils.equals(ResponseCodeEnums.success.getStatus(),apiResponse.getStatus())) {

//完成任务

logger.info(“==========>>>>> task execute success !!! taskCode={}, taskName={}, status={}, msg={}, nextTask={}”,

taskItemNo,taskName,apiResponse.getStatus(),apiResponse.getMessage(),taskAnwserVo.isNextTask());

taskManagerServ.finTask(taskNo, apiResponse.getMessage());

}else {

//异常任务

logger.info(“==========>>>>> task execute error !!! taskCode={}, taskName={}, status={}, msg={}, nextTask={}”,

taskItemNo,taskName,apiResponse.getStatus(),apiResponse.getMessage(),taskAnwserVo.isNextTask());

taskManagerServ.errTask(taskNo, apiResponse.getMessage());

}

//判断流程是否继续

if(!taskAnwserVo.isNextTask()){

break;

}

} catch (Exception e) {

//异常任务

String errorMsg = getStackTrace(e);

taskManagerServ.errTask(taskNo, errorMsg);

logger.error(“==========>>>>> Execute Task Error!!! skey={}, taskControlVo={}, errorMsg={}”,skey,taskControlVo,errorMsg);

//响应异常

return new ApiResponse(ResponseCodeEnums.flow_error);

}

}

if(StringUtils.equals(ResponseCodeEnums.success.getStatus(),apiResponse.getStatus())) {

//归档完成流程

taskManagerServ.finData(dataNo);

}

return apiResponse;

}

a61bdc490364

image.png

SpringFactory实现类

/**

* Created by

*/

@Component

public class SpringFactory implements ApplicationContextAware {

private static ApplicationContext applicationContext;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

if(SpringFactory.applicationContext == null) {

SpringFactory.applicationContext = applicationContext;

}

}

//获取applicationContext

public static ApplicationContext getApplicationContext() {

return applicationContext;

}

//通过name获取 Bean.

public static Object getBean(String name){

return getApplicationContext().getBean(name);

}

//通过class获取Bean.

public static T getBean(Class clazz){

return getApplicationContext().getBean(clazz);

}

//通过name,以及Clazz返回指定的Bean

public static T getBean(String name,Class clazz){

return getApplicationContext().getBean(name, clazz);

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156591.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • x86平台inline hook原理和实现

    x86平台inline hook原理和实现概念inlinehook是一种通过修改机器码的方式来实现hook的技术。原理对于正常执行的程序,它的函数调用流程大概是这样的:0x1000地址的call指令执行后跳转到0x3000地址处执行

    2022年7月2日
    25
  • ubuntu安装nginx及其依赖「建议收藏」

    ubuntu安装nginx及其依赖「建议收藏」最近安装nginx踩了一些坑,所以在这记录一下,也希望能够帮助到一些人。下面就开始说一下我的安装步骤:一:安装pcre:打开终端,输入以下命令:sudo-s#进入root用户aptinstallbuild-essential#安装gcc编译器及其环境,包含gcc,gdb,make等wgethttps://ftp.pcre.org/pub/pcre/pcre-8.37.tar.gz#下载安装包tar-zxvfpcre-8.37.tar.gz#解压cd

    2026年1月25日
    4
  • socket使用方法_socket调试工具怎么用

    socket使用方法_socket调试工具怎么用socketpair函数概要如下:#include#includeintsocketpair(intdomain,inttype,intprotocol,intsv[2]);sys/types.h文件需要用来定义一些C宏常量。sys/socket.h文件必须包含进来定义socketpair函数原型。socketpair函数需要四个参数。他们是:套接口的域

    2022年10月14日
    6
  • arp内网攻击_外网和内网怎么设置

    arp内网攻击_外网和内网怎么设置arpspoof是一款进行arp欺骗的工具,攻击者通过毒化受害者arp缓存,将网关mac替换为攻击者mac,然后攻击者可截获受害者发送和收到的数据包,可获取受害者账户、密码等相关敏感信息。本次测试是在局域网内进行,利用kali截获centos相关数据攻击者ip:192.168.157.129受害者ip:192.168.157.2501、在kali中开启端口转发功能:echo…

    2022年10月7日
    4
  • MyCCL特征码定位原理学习[通俗易懂]

    MyCCL特征码定位原理学习[通俗易懂]这段时间学习WEB方面的技术,遇到了木马免杀特征码定位的问题,这里做一下学习笔记。这里对MyCCL的分块原理做一下探究对指定文件生成10个切块 对指定的木马进行切块后,文件列表是这样的。 注意这里是从E0作为切块的偏移量。也就是说从E0的位置开始逐个切块,E0之前的内容是保留的。这样做的目的是保留一些PE必须的头文件信息。我们来通过亲身的探究来解析一下MyCCL的切块区

    2025年8月15日
    4
  • 非满秩矩阵也能求逆矩阵吗_广义逆矩阵的性质

    非满秩矩阵也能求逆矩阵吗_广义逆矩阵的性质今天遇到一个很奇怪的问题:一个方阵,逆矩阵存在,但不是满秩。问题来源  在实际应用的时候,发现返回值都是0,于是跟踪到这里,发现了这个问题:JtJ不是满秩,因此JtJN保持初始化的零值。matJtJN=zeros(N,N);matResult=zeros(N,1);if(N==rank(JtJ)){JtJN=inv(JtJ);}for…

    2025年7月26日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号