Activiti7.0进阶学习(八):Activiti抛出了PersistenceException

背景

  1. 记录activiti为什么会抛出PersistenceException

过程

  • 操作过程
  1. activiti的审批流程中的某个节点是或签节点。
  2. 两个审批人同时进行同意操作(complete)
  3. 这个异常是必出现的。
  • 错误信息
2020-08-05 15:20:27.904 ERROR [http-nio-9011-exec-9] o.activiti.engine.impl.interceptor.CommandContext - Error while closing command context 
org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`gangxin_test`.`ACT_RU_IDENTITYLINK`, CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)) 
### The error may involve org.activiti.engine.impl.persistence.entity.IdentityLinkEntityImpl.insertIdentityLink-Inline 
### The error occurred while setting parameters 
### SQL: insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_)     values (?,             1,             ?,             ?,             ?,             ?,             ?,             ?) 
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`gangxin_test`.`ACT_RU_IDENTITYLINK`, CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)) 
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) 
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200) 
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185) 
	at org.activiti.engine.impl.db.DbSqlSession.flushRegularInsert(DbSqlSession.java:649) 
	at org.activiti.engine.impl.db.DbSqlSession.flushInsertEntities(DbSqlSession.java:544) 
	at org.activiti.engine.impl.db.DbSqlSession.flushInserts(DbSqlSession.java:527) 
	at org.activiti.engine.impl.db.DbSqlSession.flush(DbSqlSession.java:417) 
	at org.activiti.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:197) 
	at org.activiti.engine.impl.interceptor.CommandContext.close(CommandContext.java:75) 
	at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:72) 
	at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47) 
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) 
	at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45) 
	at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:29) 
	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44) 
	at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:39) 
	at org.activiti.engine.impl.TaskServiceImpl.setAssignee(TaskServiceImpl.java:130) 
	at com.bdfint.gangxin.workflow.service.impl.ProcessTaskServiceImpl.setAssignee(ProcessTaskServiceImpl.java:63) 
	at com.bdfint.gangxin.workflow.service.impl.ProcessTaskServiceImpl$$FastClassBySpringCGLIB$$7e4c4d61.invoke(<generated>) 
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) 
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) 
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) 
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) 
	at com.bdfint.gangxin.workflow.service.impl.ProcessTaskServiceImpl$$EnhancerBySpringCGLIB$$feb2217d.setAssignee(<generated>) 
	at com.bdfint.gangxin.workflow.service.impl.BusinessTaskServiceImpl.completeTask(BusinessTaskServiceImpl.java:230) 
	at com.bdfint.gangxin.workflow.service.impl.BusinessTaskServiceImpl.completeTask(BusinessTaskServiceImpl.java:196) 
	at com.bdfint.gangxin.workflow.service.impl.BusinessTaskServiceImpl$$FastClassBySpringCGLIB$$47fb33b0.invoke(<generated>) 
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) 
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) 
	at com.bdfint.cloud.common.aspect.DistributedLockAspect.doDistributedLock(DistributedLockAspect.java:54) 
	at sun.reflect.GeneratedMethodAccessor1181.invoke(Unknown Source) 
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
	at java.lang.reflect.Method.invoke(Method.java:498) 
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) 
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) 
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174) 
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) 
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) 
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) 
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) 
	at com.bdfint.gangxin.workflow.service.impl.BusinessTaskServiceImpl$$EnhancerBySpringCGLIB$$e7719764.completeTask(<generated>) 
	at com.bdfint.gangxin.workflow.controller.TaskController.complete(TaskController.java:33) 
	at sun.reflect.GeneratedMethodAccessor1568.invoke(Unknown Source) 
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
	at java.lang.reflect.Method.invoke(Method.java:498) 
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) 
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) 
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) 
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) 
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) 
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) 
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) 
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) 
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) 
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158) 
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126) 
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111) 
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:84) 
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) 
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) 
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) 
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) 
	at org.apache.catalina.core.StandardHostValve.invoke$original$lbtTjaGP(StandardHostValve.java:140) 
	at org.apache.catalina.core.StandardHostValve.invoke$original$lbtTjaGP$accessor$putWgHJU(StandardHostValve.java) 
	at org.apache.catalina.core.StandardHostValve$auxiliary$WU3RIKPh.call(Unknown Source) 
	at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93) 
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) 
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) 
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) 
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) 
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
	at java.lang.Thread.run(Thread.java:748) 
  • 错误信息分析
    咋一看,会觉得抛出的异常是:MySQLIntegrityConstraintViolationException。其实不是。
    activiti捕获了java-connector中抛出来的异常,并打印了错误信息,然后activiti自己使用了mybatis框架,然后抛出了PersistenceException

  • 原因
    还是要理解activiti的complete的工作过程。complete的工作过程

其次就是此节点是或签。当上一个审批人审批完成后,关于此taskId的相关任务数据信息都会被删除掉的,因此后续线程进行complete操作的时候,因为会操作数据库,就一定报上面这个外键约束的异常。

  • 解决方案
    因为是或签,只有此节点有一个人签字成功,后面的人即使在签字的时候抛出了异常,业务逻辑捕获到异常,然后进行友好提示前端即可,本身业务逻辑是完全合理的。

  • 结论:大多数框架会捕获到底层的异常,然后抛出属于自己的异常。其实我们业务逻辑层面也可以捕获到这个PersistenceException,然后抛出属于业务系统的异常即可。

小结

  1. 理解activiti的底层工作过程。为什么会抛出错误信息?原理是什么?

你可能感兴趣的:(Activiti,activiti,Persistence,Exception,或签并发,complete工作)