Activiti提交审批后,会往act_ru_task插入多条重复数据,导致整个流程审批失败

冬瓜太难 2020-06-09 10:49:06
我们使用的是Activiti5.22版本,在定义好流程后,系统可以正常使用2个月左右不会出问题,2个月左右就会出现提交审批后,会往act_ru_task插入多条重复数据,导致整个流程审批失败。 想请教各位大神有没有遇到过这个问题……这个问题困扰太久了,而且只在我们的生产环境出现……
...全文
3023 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wan ser 2022-10-11
  • 打赏
  • 举报
回复

博主这个问题后面怎么处理的呢

蠢萌小呆瓜 2021-07-22
  • 打赏
  • 举报
回复

我也遇到过,本地测试的时候没出现过,生产的时候会时不时task表会出现重复的记录,没有固定的规律,我猜测可能是前端连续快速操作造成的,

grance123 2021-06-11
  • 打赏
  • 举报
回复

你的是多插入数据,我的是这个表act_ru_task表里的数据有时候会插入的比较慢,大神们有遇到这个问题吗

为乐而来 2020-12-25
  • 打赏
  • 举报
回复
应该是某一种流程中的某一个结点有逻辑问题,应该查一下出问题的这个流程有什么共同的特点
紫宇寰 2020-12-25
  • 打赏
  • 举报
回复
加入一个校验逻辑不行吗?先去数据库里查询一下是否有这条数据,然后再写入
tchaos 2020-12-25
  • 打赏
  • 举报
回复
之前碰到过一次,当时是因为前端短时间重复提交同一个审批请求导致的。加个拦截器或者直接在前端控制下就好了。
灬淘气 2020-11-27
  • 打赏
  • 举报
回复
请问楼主解决了吗?我们也是用的Activiti5.22版本, 除了出现往act_ru_task表中插入重复数据的问题, 还出现流程走到一半就突然结束了,重新部署一下流程又可以了, 太难了
  • 打赏
  • 举报
回复
2个月不出问题 是不是这两个月都没有点击提交这个操作,或者是这2个月都没有走到那个流程那里,你要现在本地开发环境去走整个流程,看看数据库存的这个数据,是从哪一个节点出的问题,然后着重去看一下。
冬瓜太难 2020-06-10
  • 打赏
  • 举报
回复
引用 4 楼 亦夜 的回复:
能再模拟出这个问题吗,按你的意思,这个问题是固定2个月会出现一次吗?,但是你又找不到这个问题具体在哪,那这个时候你就只能想办法从一个角度去解决这个问题,比如你有多条重复审批数据,但是你审批成功一条之后,就将这条审批数据存入到审批成功记录表,下次审批如果存在相同的数据就不再审批
模拟不出来,只有生产上运行两个月左右会出现这个问题,点击审批的时候会往task表插入一条正常的数据,相隔几毫秒会继续往task表插入数据,然后execution表的这个流程实例数据状态也没改变,然后查询这笔审批的时候就因为多了数据导致报错了
亦夜 2020-06-10
  • 打赏
  • 举报
回复
能再模拟出这个问题吗,按你的意思,这个问题是固定2个月会出现一次吗?,但是你又找不到这个问题具体在哪,那这个时候你就只能想办法从一个角度去解决这个问题,比如你有多条重复审批数据,但是你审批成功一条之后,就将这条审批数据存入到审批成功记录表,下次审批如果存在相同的数据就不再审批
冬瓜太难 2020-06-10
  • 打赏
  • 举报
回复
引用 2 楼 屌丝邂逅白富美 的回复:
2个月不出问题 是不是这两个月都没有点击提交这个操作,或者是这2个月都没有走到那个流程那里,你要现在本地开发环境去走整个流程,看看数据库存的这个数据,是从哪一个节点出的问题,然后着重去看一下。
就是一级审批提交的时候,数据就多了,也不会报错,等查询这个审批信息的时候就报错了。现在能想到的地方都检查了,都确定不了问题原因
冬瓜太难 2020-06-09
  • 打赏
  • 举报
回复
有人嘛,有大神路过吗!!!
Byron_min_liu 2022-02-07
  • 举报
回复
@冬瓜太难 我这里也遇到了,重复提交造成的。你们的生产环境的历史错误数据是怎么处理的啊?现在就是不知道如何处理历史错误数据
1 ACTIVITI数据库表结构 2 1.1 数据库表名说明 2 1.2 数据库表结构 3 1.2.1 Activiti数据表清单: 3 1.2.2 表名:ACT_GE_BYTEARRAY (通用的流程定义和流程资源) 3 1.2.3 表名:ACT_GE_PROPERTY (系统相关属性) 4 1.2.4 表名:ACT_HI_ACTINST (历史节点表) 5 1.2.5 表名:ACT_HI_ATTACHMENT (附件信息) 6 1.2.6 表名:ACT_HI_COMMENT (历史审批意见表) 6 1.2.7 表名:ACT_HI_DETAIL (历史详细信息) 7 1.2.8 表名:ACT_HI_IDENTITYLINK (历史流程人员表) 8 1.2.9 表名:ACT_HI_PROCINST(历史流程实例信息)核心表 8 1.2.10 表名:ACT_HI_TASKINST(历史任务流程实例信息)核心表 9 1.2.11 表名:ACT_HI_VARINST(历史变量信息) 9 1.2.12 表名:ACT_ID_GROUP(用户组表) 10 1.2.13 表名:ACT_ID_INFO (用户扩展信息表) 10 1.2.14 表名:ACT_ID_MEMBERSHIP(用户用户组关联表) 11 1.2.15 表名:ACT_ID_USER(用户信息表) 11 1.2.16 表名:ACT_RE_DEPLOYMENT(部署信息表) 12 1.2.17 表名:ACT_RE_MODEL (流程设计模型部署表) 12 1.2.18 表名:ACT_RE_PROCDEF (流程定义表) 13 1.2.19 表名:ACT_RU_EVENT_SUBSCR (运行时事件) 14 1.2.20 表名:ACT_RU_EXECUTION (运行时流程执行实例) 14 1.2.21 表名:ACT_RU_IDENTITYLINK(身份联系) 15 1.2.22 表名:ACT_RU_JOB(运行中的任务) 15 1.2.23 表名:ACT_RU_TASK(运行时任务数据表) 16 1.2.24 表名:ACT_RU_VARIABLE(运行时流程变量数据表) 17 2 ACTIVITI中主要对象的关系 17
主要内容: 2:工作流的执行过程 演示程序:Activiti控制台 3:Activiti介绍 Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 流程图。 3.1:工作流引擎 ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。 3.2:BPMN 业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram) 3.3:数据库(先学后看) Activiti数据库支持: Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。 ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。 ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。 ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。 ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。 表结构操作: 3.3.1:资源库流程规则表 1)act_re_deployment 部署信息表 2)act_re_model 流程设计模型部署表 3)act_re_procdef 流程定义数据表 3.3.2:运行时数据库表 1)act_ru_execution 运行时流程执行实例表 2)act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 3)act_ru_task 运行时任务节点表 4)act_ru_variable 运行时流程变量数据表 3.3.3:历史数据库表 1)act_hi_actinst 历史节点表 2)act_hi_attachment 历史附件表 3)act_hi_comment 历史意见表 4)act_hi_identitylink 历史流程人员表 5)act_hi_detail 历史详情表,提供历史变量的查询 6)act_hi_procinst 历史流程实例表 7)act_hi_taskinst 历史任务实例表 8)act_hi_varinst 历史变量表 3.3.4:组织机构表 1)act_id_group 用户组信息表 2)act_id_info 用户扩展信息表 3)act_id_membership 用户与用户组对应信息表 4)act_id_user 用户信息表 这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足 3.3.5:通用数据表 1)act_ge_bytearray 二进制数据表 2)act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录, 3.4:activiti.cfg.xml(activiti的配置文件) Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。 定义数据库配置参数: jdbcUrl: 数据库的JDBC URL。 jdbcDriver: 对应不同数据库类型的驱动。 jdbcUsername: 连接数据库的用户名。 jdbcPassword: 连接数据库的密码。 基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池。 下面的参数可以用来配置连接池(来自MyBatis参数): jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。 jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。 jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 省略...
做一个最简单的HellWorld流程用代码的方式实现并且走完流程。 1.首先是需要部署流程定义。 2.启动流程实例。 3.查看流程任务以及完成流程任务。 创建一个单元测试类ActivitiHelloWorldTest,首先第一操作流程就必须要获取引擎实例: [java] view plain copy 1. 流程引擎实例 会自动读取activiti.cfg.xml文件 3. */ 4. private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); 把绘制的流程定义图(我在上一篇博文上绘制过),部署下: [java] view plain copy 1. 流程定义 3. */ 4. @Test 5. public void deploy(){ 6. // 获取部署对象 7. Deployment deployment=processEngine.getRepositoryService() // 部署Service 8. .createDeployment() // 创建部署 9. .addClasspathResource("diagrams/helloWorld.bpmn") // 加载资源文件 10. .addClasspathResource("diagrams/helloWorld.png") // 加载资源文件 11. .name("HelloWorld流程") // 流程名称 12. .deploy(); // 部署 13. System.out.println("流程部署ID:"+deployment.getId()); 14. System.out.println("流程部署Name:"+deployment.getName()); 15. } 接着需要启动流程实例,这样一个流程才开始: [java] view plain copy 1. 流程实例 3. */ 4. @Test 5. public void start(){ 6. // 启动并获取流程实例 7. ProcessInstance processInstance=processEngine.getRuntimeService() // 运行时流程实例Service 8. .startProcessInstanceByKey("myFirstProcess"); // 流程定义表的KEY字段值 9. System.out.println("流程实例ID:"+processInstance.getId()); 10. System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId()); 11. } 查看一下李四这个用户的任务信息: [java] view plain copy 1. Task(){ 6. // 查询并且返回任务即可 7. List<Task> taskList=processEngine.getTaskService() // 任务相关Service 8. .createTaskQuery() // 创建任务查询 9. .taskAssignee("李四") // 指定某个人 10. .list(); 11. for(Task task:taskList){ 12. System.out.println("任务ID:"+task.getId()); 13. System.out.println("任务名称:"+task.getName()); 14. System.out.println("任务创建时间:"+task.getCreateTime()); 15. System.out.println("任务委派人:"+task.getAssignee()); 16. System.out.println("流程实例ID:"+task.getProcessInstanceId()); 17. } 18. } 最后完成HelloWorld节点任务,把流程走完: [java] view plain copy 1. Task(){ 6. processEngine.getTaskService() // 任务相关Service 7. .complete("2504"); // 指定要完成的任务ID 8. } 有个很重要的概念,流程定义和流程实例的关系,可以把这两种关系理解成是类和对象的关系。 流程定义是一个模板,而流程实例就是通过模板演变出来的具体的可用的东西。 首先当运行:deploy()部署流程定义方法,在数据库中流程定义表会发生一些变化新增了一条数据act_re_deployment流程定义部署表: 然后act_re_prodef流程定义表也会有一条数据插入: 还有一个act_ge_bytearray表用来存储资源信息: 接着来运行start()启动流程实例: act_ru_task运行时流程任务表新增了一条数据act_ru_execution运行时流程执行表: act_ru_identitulink是用于执行主体相关信息表: 可以查看刚刚"李四”这个用户的任务: 运行findTask()查看用户任务,控制台输出如下: [java] view plain copy 1. 流程实例ID:5001 查询到了数据就说明这个用户有任务可以执行,接着运行completeTask()方法完成任务: 然后数据库中ru开头的运行时候所有表的数据都没了,因为现在流程结束,不需要这些数据了。 在hi开头的表里,会新增不少数据,这些数据主要是用来归档查询用的,也就是历史数据act_hi_taskinst 历史流程实例任务表加了一条任务数据act_hi_procinst 历史流程实例实例表加了一条流程实例相关信息的数据(包括开始时间,结束时间等等信息); act_hi_identitylink 历史流程实例参数者的表加了一条数据act_hi_actinst 历史活动节点表加了三条流程活动节点信息的数据(每个流程实例具体的执行活动节点的信息);

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧