一、流程实例
什么是流程实例
流程实例(ProcessInstance)代表流程定义的执行实例。
一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。
例如:用户或程序按照流程定义内容发起一个流程,这就是一个流程实例。
流程定义和流程实例的图解:
启动流程实例 并添加Businesskey(业务标识)
流程定义部署在activiti后,就可以在系统中通过activiti去管理该流程的执行,执行流程表示流程的一次执行。
比如部署系统出差流程后,如果某用户要申请出差这时就需要执行这个流程,如果另外一个用户也要申请出差则也需要执行该流程,每个执行互不影响,每个执行是单独的流程实例。
启动流程实例时,指定的businesskey,就会在act_ru_execution #流程实例的执行表中存储businesskey。
Businesskey:业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。
比如:出差流程启动一个流程实例,就可以将出差单的id作为业务标识存储到activiti中,将来查询activiti的流程实例信息就可以获取出差单的id从而关联查询业务系统数据库得到出差单信息。
/**
* 启动前记着部署流程定义
* 启动流程实例,添加businessKey
*/
@Test
public void addBusinessKey(){
// 1、得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001
ProcessInstance processInstance = runtimeService.
startProcessInstanceByKey("myEvection","1001");
// 4、输出processInstance相关属性
System.out.println("业务id=="+processInstance.getBusinessKey());
}
日志打印
2022-04-06 15:26:37,556 1790 [ main] DEBUG mpl.interceptor.LogInterceptor - --- starting SchemaOperationsProcessEngineBuild --------------------------------------------------------
2022-04-06 15:26:37,560 1794 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.interceptor.CommandInvoker$1 added to agenda
2022-04-06 15:26:37,566 1800 [ main] DEBUG ti.engine.impl.db.DbSqlSession - Executing performSchemaOperationsProcessEngineBuild with setting true
2022-04-06 15:26:37,566 1800 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2022-04-06 15:26:37,566 1800 [ main] DEBUG source.pooled.PooledDataSource - Checked out connection 1095088856 from pool.
2022-04-06 15:26:37,566 1800 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,609 1843 [ main] DEBUG pertyEntityImpl.selectProperty - ==> Preparing: select * from ACT_GE_PROPERTY where NAME_ = ?
2022-04-06 15:26:37,621 1855 [ main] DEBUG pertyEntityImpl.selectProperty - ==> Parameters: schema.version(String)
2022-04-06 15:26:37,632 1866 [ main] DEBUG pertyEntityImpl.selectProperty - <== Total: 1
2022-04-06 15:26:37,635 1869 [ main] DEBUG ti.engine.impl.db.DbSqlSession - Flushing dbSqlSession
2022-04-06 15:26:37,635 1869 [ main] DEBUG ti.engine.impl.db.DbSqlSession - flush summary: 0 insert, 0 update, 0 delete.
2022-04-06 15:26:37,635 1869 [ main] DEBUG ti.engine.impl.db.DbSqlSession - now executing flush...
2022-04-06 15:26:37,635 1869 [ main] DEBUG aloneMybatisTransactionContext - firing event committing...
2022-04-06 15:26:37,635 1869 [ main] DEBUG aloneMybatisTransactionContext - committing the ibatis sql session...
2022-04-06 15:26:37,636 1870 [ main] DEBUG aloneMybatisTransactionContext - firing event committed...
2022-04-06 15:26:37,636 1870 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,636 1870 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,636 1870 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1095088856 to pool.
2022-04-06 15:26:37,636 1870 [ main] DEBUG mpl.interceptor.LogInterceptor - --- SchemaOperationsProcessEngineBuild finished --------------------------------------------------------
2022-04-06 15:26:37,636 1870 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,637 1871 [ main] INFO .engine.impl.ProcessEngineImpl - ProcessEngine default created
2022-04-06 15:26:37,642 1876 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,643 1877 [ main] DEBUG mpl.interceptor.LogInterceptor - --- starting ValidateExecutionRelatedEntityCountCfgCmd --------------------------------------------------------
2022-04-06 15:26:37,643 1877 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.interceptor.CommandInvoker$1 added to agenda
2022-04-06 15:26:37,643 1877 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2022-04-06 15:26:37,643 1877 [ main] DEBUG source.pooled.PooledDataSource - Checked out connection 1095088856 from pool.
2022-04-06 15:26:37,643 1877 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,643 1877 [ main] DEBUG pertyEntityImpl.selectProperty - ==> Preparing: select * from ACT_GE_PROPERTY where NAME_ = ?
2022-04-06 15:26:37,644 1878 [ main] DEBUG pertyEntityImpl.selectProperty - ==> Parameters: cfg.execution-related-entities-count(String)
2022-04-06 15:26:37,644 1878 [ main] DEBUG pertyEntityImpl.selectProperty - <== Total: 1
2022-04-06 15:26:37,645 1879 [ main] DEBUG ti.engine.impl.db.DbSqlSession - Flushing dbSqlSession
2022-04-06 15:26:37,645 1879 [ main] DEBUG ti.engine.impl.db.DbSqlSession - flush summary: 0 insert, 0 update, 0 delete.
2022-04-06 15:26:37,645 1879 [ main] DEBUG ti.engine.impl.db.DbSqlSession - now executing flush...
2022-04-06 15:26:37,645 1879 [ main] DEBUG aloneMybatisTransactionContext - firing event committing...
2022-04-06 15:26:37,645 1879 [ main] DEBUG aloneMybatisTransactionContext - committing the ibatis sql session...
2022-04-06 15:26:37,645 1879 [ main] DEBUG aloneMybatisTransactionContext - firing event committed...
2022-04-06 15:26:37,645 1879 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,645 1879 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,645 1879 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1095088856 to pool.
2022-04-06 15:26:37,645 1879 [ main] DEBUG mpl.interceptor.LogInterceptor - --- ValidateExecutionRelatedEntityCountCfgCmd finished --------------------------------------------------------
2022-04-06 15:26:37,645 1879 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,645 1879 [ main] INFO activiti.engine.ProcessEngines - initialised process engine default
2022-04-06 15:26:37,647 1881 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,647 1881 [ main] DEBUG mpl.interceptor.LogInterceptor - --- starting StartProcessInstanceCmd --------------------------------------------------------
2022-04-06 15:26:37,647 1881 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.interceptor.CommandInvoker$1 added to agenda
2022-04-06 15:26:37,647 1881 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2022-04-06 15:26:37,647 1881 [ main] DEBUG source.pooled.PooledDataSource - Checked out connection 1095088856 from pool.
2022-04-06 15:26:37,647 1881 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,648 1882 [ main] DEBUG ctLatestProcessDefinitionByKey - ==> Preparing: select * from ACT_RE_PROCDEF where KEY_ = ? and (TENANT_ID_ = '' or TENANT_ID_ is null) and VERSION_ = (select max(VERSION_) from ACT_RE_PROCDEF where KEY_ = ? and (TENANT_ID_ = '' or TENANT_ID_ is null))
2022-04-06 15:26:37,648 1882 [ main] DEBUG ctLatestProcessDefinitionByKey - ==> Parameters: MyEvection(String), MyEvection(String)
2022-04-06 15:26:37,652 1886 [ main] DEBUG ctLatestProcessDefinitionByKey - <== Total: 1
2022-04-06 15:26:37,652 1886 [ main] DEBUG entEntityImpl.selectDeployment - ==> Preparing: select * from ACT_RE_DEPLOYMENT where ID_ = ?
2022-04-06 15:26:37,652 1886 [ main] DEBUG entEntityImpl.selectDeployment - ==> Parameters: 1(String)
2022-04-06 15:26:37,654 1888 [ main] DEBUG entEntityImpl.selectDeployment - <== Total: 1
2022-04-06 15:26:37,654 1888 [ main] DEBUG mpl.bpmn.deployer.BpmnDeployer - Processing deployment 出差申请流程
2022-04-06 15:26:37,655 1889 [ main] DEBUG .selectResourcesByDeploymentId - ==> Preparing: select * from ACT_GE_BYTEARRAY where DEPLOYMENT_ID_ = ? order by NAME_ asc
2022-04-06 15:26:37,656 1890 [ main] DEBUG .selectResourcesByDeploymentId - ==> Parameters: 1(String)
2022-04-06 15:26:37,664 1898 [ main] DEBUG .selectResourcesByDeploymentId - <== Total: 2
2022-04-06 15:26:37,664 1898 [ main] DEBUG ployer.ParsedDeploymentBuilder - Processing BPMN resource bpmn/evection.bpmn20.xml
2022-04-06 15:26:37,715 1949 [ main] DEBUG er.handler.ProcessParseHandler - Parsing process MyEvection
2022-04-06 15:26:37,726 1960 [ main] WARN ine.impl.bpmn.parser.BpmnParse - Invalid reference in diagram interchange definition: could not find sid-c5bb44df-ab85-4af2-9a43-b81726289a17
2022-04-06 15:26:37,728 1962 [ main] DEBUG ssDefinitionByDeploymentAndKey - ==> Preparing: select * from ACT_RE_PROCDEF where DEPLOYMENT_ID_ = ? and KEY_ = ? and (TENANT_ID_ = '' or TENANT_ID_ is null)
2022-04-06 15:26:37,728 1962 [ main] DEBUG ssDefinitionByDeploymentAndKey - ==> Parameters: 1(String), MyEvection(String)
2022-04-06 15:26:37,729 1963 [ main] DEBUG ssDefinitionByDeploymentAndKey - <== Total: 1
2022-04-06 15:26:37,731 1965 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,731 1965 [ main] DEBUG mpl.interceptor.LogInterceptor - --- starting GetProcessDefinitionInfoCmd --------------------------------------------------------
2022-04-06 15:26:37,731 1965 [ main] DEBUG ptor.CommandContextInterceptor - Valid context found. Reusing it for the current command 'org.activiti.engine.impl.cmd.GetProcessDefinitionInfoCmd'
2022-04-06 15:26:37,731 1965 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.interceptor.CommandInvoker$1 added to agenda
2022-04-06 15:26:37,733 1967 [ main] DEBUG itionInfoByProcessDefinitionId - ==> Preparing: select * from ACT_PROCDEF_INFO where PROC_DEF_ID_ = ?
2022-04-06 15:26:37,733 1967 [ main] DEBUG itionInfoByProcessDefinitionId - ==> Parameters: MyEvection:1:4(String)
2022-04-06 15:26:37,734 1968 [ main] DEBUG itionInfoByProcessDefinitionId - <== Total: 0
2022-04-06 15:26:37,734 1968 [ main] DEBUG mpl.interceptor.LogInterceptor - --- GetProcessDefinitionInfoCmd finished --------------------------------------------------------
2022-04-06 15:26:37,734 1968 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,736 1970 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,736 1970 [ main] DEBUG mpl.interceptor.LogInterceptor - --- starting GetNextIdBlockCmd --------------------------------------------------------
2022-04-06 15:26:37,736 1970 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.interceptor.CommandInvoker$1 added to agenda
2022-04-06 15:26:37,736 1970 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2022-04-06 15:26:37,739 1973 [ main] DEBUG source.pooled.PooledDataSource - Created connection 1358857082.
2022-04-06 15:26:37,739 1973 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@50fe837a]
2022-04-06 15:26:37,739 1973 [ main] DEBUG pertyEntityImpl.selectProperty - ==> Preparing: select * from ACT_GE_PROPERTY where NAME_ = ?
2022-04-06 15:26:37,740 1974 [ main] DEBUG pertyEntityImpl.selectProperty - ==> Parameters: next.dbid(String)
2022-04-06 15:26:37,741 1975 [ main] DEBUG pertyEntityImpl.selectProperty - <== Total: 1
2022-04-06 15:26:37,741 1975 [ main] DEBUG ti.engine.impl.db.DbSqlSession - Flushing dbSqlSession
2022-04-06 15:26:37,742 1976 [ main] DEBUG ti.engine.impl.db.DbSqlSession - update PropertyEntity[name=next.dbid, value=5001]
2022-04-06 15:26:37,742 1976 [ main] DEBUG ti.engine.impl.db.DbSqlSession - flush summary: 0 insert, 1 update, 0 delete.
2022-04-06 15:26:37,742 1976 [ main] DEBUG ti.engine.impl.db.DbSqlSession - now executing flush...
2022-04-06 15:26:37,742 1976 [ main] DEBUG ti.engine.impl.db.DbSqlSession - updating: PropertyEntity[name=next.dbid, value=5001]
2022-04-06 15:26:37,742 1976 [ main] DEBUG pertyEntityImpl.updateProperty - ==> Preparing: update ACT_GE_PROPERTY SET REV_ = ?, VALUE_ = ? where NAME_ = ? and REV_ = ?
2022-04-06 15:26:37,742 1976 [ main] DEBUG pertyEntityImpl.updateProperty - ==> Parameters: 3(Integer), 5001(String), next.dbid(String), 2(Integer)
2022-04-06 15:26:37,743 1977 [ main] DEBUG pertyEntityImpl.updateProperty - <== Updates: 1
2022-04-06 15:26:37,743 1977 [ main] DEBUG aloneMybatisTransactionContext - firing event committing...
2022-04-06 15:26:37,743 1977 [ main] DEBUG aloneMybatisTransactionContext - committing the ibatis sql session...
2022-04-06 15:26:37,743 1977 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@50fe837a]
2022-04-06 15:26:37,748 1982 [ main] DEBUG aloneMybatisTransactionContext - firing event committed...
2022-04-06 15:26:37,748 1982 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@50fe837a]
2022-04-06 15:26:37,748 1982 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@50fe837a]
2022-04-06 15:26:37,748 1982 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1358857082 to pool.
2022-04-06 15:26:37,748 1982 [ main] DEBUG mpl.interceptor.LogInterceptor - --- GetNextIdBlockCmd finished --------------------------------------------------------
2022-04-06 15:26:37,748 1982 [ main] DEBUG mpl.interceptor.LogInterceptor -
2022-04-06 15:26:37,749 1983 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,749 1983 [ main] DEBUG ity.ExecutionEntityManagerImpl - Child execution Execution[ id '2502' ] - parent '2501' created with parent 2501
2022-04-06 15:26:37,750 1984 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.agenda.ContinueProcessOperation added to agenda
2022-04-06 15:26:37,750 1984 [ main] DEBUG mpl.interceptor.CommandInvoker - Executing operation class org.activiti.engine.impl.agenda.ContinueProcessOperation
2022-04-06 15:26:37,750 1984 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,750 1984 [ main] DEBUG genda.ContinueProcessOperation - Executing activityBehavior class org.activiti.engine.impl.bpmn.behavior.NoneStartEventActivityBehavior on activity 'sid-8c4057c8-f4c7-4e4b-bfd2-0ae1c5cfccdf' with execution 2502
2022-04-06 15:26:37,752 1986 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.agenda.TakeOutgoingSequenceFlowsOperation added to agenda
2022-04-06 15:26:37,752 1986 [ main] DEBUG mpl.interceptor.CommandInvoker - Executing operation class org.activiti.engine.impl.agenda.TakeOutgoingSequenceFlowsOperation
2022-04-06 15:26:37,752 1986 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,752 1986 [ main] DEBUG OutgoingSequenceFlowsOperation - Leaving flow node class org.activiti.bpmn.model.StartEvent with id 'sid-8c4057c8-f4c7-4e4b-bfd2-0ae1c5cfccdf' by following it's 1 outgoing sequenceflow
2022-04-06 15:26:37,753 1987 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.agenda.ContinueProcessOperation added to agenda
2022-04-06 15:26:37,753 1987 [ main] DEBUG mpl.interceptor.CommandInvoker - Executing operation class org.activiti.engine.impl.agenda.ContinueProcessOperation
2022-04-06 15:26:37,753 1987 [ main] DEBUG genda.ContinueProcessOperation - Sequence flow 'sid-053b8b87-bb95-4563-9b8c-99ab12cdc04b' encountered. Continuing process by following it using execution 2502
2022-04-06 15:26:37,753 1987 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.agenda.ContinueProcessOperation added to agenda
2022-04-06 15:26:37,753 1987 [ main] DEBUG mpl.interceptor.CommandInvoker - Executing operation class org.activiti.engine.impl.agenda.ContinueProcessOperation
2022-04-06 15:26:37,753 1987 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,754 1988 [ main] DEBUG genda.ContinueProcessOperation - Executing activityBehavior class org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior on activity 'sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3' with execution 2502
2022-04-06 15:26:37,768 2002 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: AUDIT
2022-04-06 15:26:37,768 2002 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: AUDIT
2022-04-06 15:26:37,768 2002 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,768 2002 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,768 2002 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: ACTIVITY
2022-04-06 15:26:37,769 2003 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: AUDIT
2022-04-06 15:26:37,769 2003 [ main] DEBUG .history.DefaultHistoryManager - Current history level: AUDIT, level required: AUDIT
2022-04-06 15:26:37,769 2003 [ main] DEBUG da.DefaultActivitiEngineAgenda - Operation class org.activiti.engine.impl.agenda.ExecuteInactiveBehaviorsOperation added to agenda
2022-04-06 15:26:37,769 2003 [ main] DEBUG mpl.interceptor.CommandInvoker - Executing operation class org.activiti.engine.impl.agenda.ExecuteInactiveBehaviorsOperation
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - Flushing dbSqlSession
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert org.activiti.engine.impl.persistence.entity.HistoricTaskInstanceEntityImpl@376a312c
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert HistoricProcessInstanceEntity[superProcessInstanceId=null]
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert Task[id=2505, name=创建出差申请]
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert HistoricActivityInstanceEntity[id=2503, activityId=sid-8c4057c8-f4c7-4e4b-bfd2-0ae1c5cfccdf, activityName=null]
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert HistoricActivityInstanceEntity[id=2504, activityId=sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3, activityName=创建出差申请]
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert org.activiti.engine.impl.persistence.entity.HistoricIdentityLinkEntityImpl@28d6290
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert IdentityLinkEntity[id=2506, type=participant, userId=zhangsan, processInstanceId=2501]
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert ProcessInstance[2501]
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - insert Execution[ id '2502' ] - activity 'sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3 - parent '2501'
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - flush summary: 9 insert, 0 update, 0 delete.
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - now executing flush...
2022-04-06 15:26:37,770 2004 [ main] DEBUG ti.engine.impl.db.DbSqlSession - inserting: org.activiti.engine.impl.persistence.entity.HistoricTaskInstanceEntityImpl@376a312c
2022-04-06 15:26:37,770 2004 [ main] DEBUG mpl.insertHistoricTaskInstance - ==> Preparing: insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_, CATEGORY_, TENANT_ID_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
2022-04-06 15:26:37,780 2014 [ main] DEBUG mpl.insertHistoricTaskInstance - ==> Parameters: 2505(String), MyEvection:1:4(String), 2501(String), 2502(String), 创建出差申请(String), null, null, null, zhangsan(String), 2022-04-06 15:26:37.768(Timestamp), null, null, null, null, sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3(String), null, 50(Integer), null, null, (String)
2022-04-06 15:26:37,781 2015 [ main] DEBUG mpl.insertHistoricTaskInstance - <== Updates: 1
2022-04-06 15:26:37,781 2015 [ main] DEBUG ti.engine.impl.db.DbSqlSession - inserting: HistoricProcessInstanceEntity[superProcessInstanceId=null]
2022-04-06 15:26:37,781 2015 [ main] DEBUG .insertHistoricProcessInstance - ==> Preparing: insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, START_TIME_, END_TIME_, DURATION_, START_USER_ID_, START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_, DELETE_REASON_, TENANT_ID_, NAME_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
2022-04-06 15:26:37,783 2017 [ main] DEBUG .insertHistoricProcessInstance - ==> Parameters: 2501(String), 2501(String), 1001(String), MyEvection:1:4(String), 2022-04-06 15:26:37.735(Timestamp), null, null, null, sid-8c4057c8-f4c7-4e4b-bfd2-0ae1c5cfccdf(String), null, null, null, (String), null
2022-04-06 15:26:37,784 2018 [ main] DEBUG .insertHistoricProcessInstance - <== Updates: 1
2022-04-06 15:26:37,813 2047 [ main] DEBUG InsertHistoricActivityInstance - ==> Preparing: insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TENANT_ID_ ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2022-04-06 15:26:37,814 2048 [ main] DEBUG InsertHistoricActivityInstance - ==> Parameters: 2503(String), MyEvection:1:4(String), 2501(String), 2502(String), sid-8c4057c8-f4c7-4e4b-bfd2-0ae1c5cfccdf(String), null, null, null, startEvent(String), null, 2022-04-06 15:26:37.75(Timestamp), 2022-04-06 15:26:37.752(Timestamp), 2(Long), null, (String), 2504(String), MyEvection:1:4(String), 2501(String), 2502(String), sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3(String), 2505(String), null, 创建出差申请(String), userTask(String), zhangsan(String), 2022-04-06 15:26:37.754(Timestamp), null, null, null, (String)
2022-04-06 15:26:37,815 2049 [ main] DEBUG InsertHistoricActivityInstance - <== Updates: 2
2022-04-06 15:26:37,815 2049 [ main] DEBUG ti.engine.impl.db.DbSqlSession - inserting: org.activiti.engine.impl.persistence.entity.HistoricIdentityLinkEntityImpl@28d6290
2022-04-06 15:26:37,815 2049 [ main] DEBUG mpl.insertHistoricIdentityLink - ==> Preparing: insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?)
2022-04-06 15:26:37,815 2049 [ main] DEBUG mpl.insertHistoricIdentityLink - ==> Parameters: 2506(String), participant(String), zhangsan(String), null, null, 2501(String)
2022-04-06 15:26:37,817 2051 [ main] DEBUG mpl.insertHistoricIdentityLink - <== Updates: 1
2022-04-06 15:26:37,819 2053 [ main] DEBUG EntityImpl.bulkInsertExecution - ==> Preparing: insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_,IS_EVENT_SCOPE_, IS_MI_ROOT_, PARENT_ID_, SUPER_EXEC_, ROOT_PROC_INST_ID_, SUSPENSION_STATE_, TENANT_ID_, NAME_, START_TIME_, START_USER_ID_, IS_COUNT_ENABLED_, EVT_SUBSCR_COUNT_, TASK_COUNT_, JOB_COUNT_, TIMER_JOB_COUNT_, SUSP_JOB_COUNT_, DEADLETTER_JOB_COUNT_, VAR_COUNT_, ID_LINK_COUNT_) values (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2022-04-06 15:26:37,820 2054 [ main] DEBUG EntityImpl.bulkInsertExecution - ==> Parameters: 2501(String), 2501(String), 1001(String), MyEvection:1:4(String), null, true(Boolean), false(Boolean), true(Boolean), false(Boolean), false(Boolean), null, null, 2501(String), 1(Integer), (String), null, 2022-04-06 15:26:37.735(Timestamp), null, false(Boolean), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 2502(String), 2501(String), null, MyEvection:1:4(String), sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3(String), true(Boolean), false(Boolean), false(Boolean), false(Boolean), false(Boolean), 2501(String), null, 2501(String), 1(Integer), (String), null, 2022-04-06 15:26:37.749(Timestamp), null, false(Boolean), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer), 0(Integer)
2022-04-06 15:26:37,823 2057 [ main] DEBUG EntityImpl.bulkInsertExecution - <== Updates: 2
2022-04-06 15:26:37,823 2057 [ main] DEBUG ti.engine.impl.db.DbSqlSession - inserting: Task[id=2505, name=创建出差申请]
2022-04-06 15:26:37,823 2057 [ main] DEBUG tity.TaskEntityImpl.insertTask - ==> Preparing: insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, CATEGORY_, SUSPENSION_STATE_, TENANT_ID_, FORM_KEY_, CLAIM_TIME_) values (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
2022-04-06 15:26:37,824 2058 [ main] DEBUG tity.TaskEntityImpl.insertTask - ==> Parameters: 2505(String), 创建出差申请(String), null, null, 50(Integer), 2022-04-06 15:26:37.754(Timestamp), null, zhangsan(String), null, 2502(String), 2501(String), MyEvection:1:4(String), sid-2d0b2d56-8958-4a6f-8f15-8be4d3698de3(String), null, null, 1(Integer), (String), null, null
2022-04-06 15:26:37,825 2059 [ main] DEBUG tity.TaskEntityImpl.insertTask - <== Updates: 1
2022-04-06 15:26:37,825 2059 [ main] DEBUG ti.engine.impl.db.DbSqlSession - inserting: IdentityLinkEntity[id=2506, type=participant, userId=zhangsan, processInstanceId=2501]
2022-04-06 15:26:37,825 2059 [ main] DEBUG kEntityImpl.insertIdentityLink - ==> Preparing: insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?, ?, ?, ?, ?)
2022-04-06 15:26:37,826 2060 [ main] DEBUG kEntityImpl.insertIdentityLink - ==> Parameters: 2506(String), participant(String), zhangsan(String), null, null, 2501(String), null
2022-04-06 15:26:37,830 2064 [ main] DEBUG kEntityImpl.insertIdentityLink - <== Updates: 1
2022-04-06 15:26:37,830 2064 [ main] DEBUG aloneMybatisTransactionContext - firing event committing...
2022-04-06 15:26:37,830 2064 [ main] DEBUG aloneMybatisTransactionContext - committing the ibatis sql session...
2022-04-06 15:26:37,830 2064 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,834 2068 [ main] DEBUG aloneMybatisTransactionContext - firing event committed...
2022-04-06 15:26:37,834 2068 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,834 2068 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4145bad8]
2022-04-06 15:26:37,834 2068 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 1095088856 to pool.
2022-04-06 15:26:37,834 2068 [ main] DEBUG mpl.interceptor.LogInterceptor - --- StartProcessInstanceCmd finished --------------------------------------------------------
2022-04-06 15:26:37,834 2068 [ main] DEBUG mpl.interceptor.LogInterceptor -
业务id==1001
Process finished with exit code 0
Activiti的act_ru_execution中存储业务标识:
操作数据库表
启动流程实例,操作如下数据库表:
SELECT * FROM act_ru_execution #流程实例执行表,记录当前流程实例的执行情况
说明:
流程实例执行,如果当前只有一个分支时,一个流程实例只有一条记录且执行表的主键id和流程实例id相同,如果当前有多个分支正在运行则该执行表中有多条记录,存在执行表的主键和流程实例id不相同的记录。不论当前有几个分支总会有一条记录的执行表的主键和流程实例id相同
一个流程实例运行完成,此表中与流程实例相关的记录删除。
SELECT * FROM act_ru_task #任务执行表,记录当前执行的任务
说明:启动流程实例,流程当前执行到第一个任务结点,此表会插入一条记录表示当前任务的执行情况,如果任务完成则记录删除。
SELECT * FROM act_ru_identitylink #任务参与者,记录当前参与任务的用户或组
SELECT * FROM act_hi_procinst #流程实例历史表
流程实例启动,会在此表插入一条记录,流程实例运行完成记录也不会删除。
SELECT * FROM act_hi_taskinst #任务历史表,记录所有任务
开始一个任务,不仅在act_ru_task表插入记录,也会在历史任务表插入一条记录,任务历史表的主键就是任务id,任务完成此表记录不删除。
SELECT * FROM act_hi_actinst #活动历史表,记录所有活动
活动包括任务,所以此表中不仅记录了任务,还记录了流程执行过程的其它活动,比如开始事件、结束事件。
查询流程实例
流程在运行过程中可以查询流程实例的状态,当前运行结点等信息。
@Test
public void queryProcessInstance() {
// 流程定义key
String processDefinitionKey = "evection";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> list = runtimeService
.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)//
.list();
for (ProcessInstance processInstance : list) {
System.out.println("----------------------------");
System.out.println("流程实例id:"
+ processInstance.getProcessInstanceId());
System.out.println("所属流程定义id:"
+ processInstance.getProcessDefinitionId());
System.out.println("是否执行完成:" + processInstance.isEnded());
System.out.println("是否暂停:" + processInstance.isSuspended());
System.out.println("当前活动标识:" + processInstance.getActivityId());
}
}
关联BusinessKey
需求:
在activiti实际应用时,查询流程实例列表时可能要显示出业务系统的一些相关信息,比如:查询当前运行的出差流程列表需要将出差单名称、出差天数等信息显示出来,出差天数等信息在业务系统中存在,而并没有在activiti数据库中存在,所以是无法通过activiti的api查询到出差天数等信息。
实现:
在查询流程实例时,通过businessKey(业务标识 )关联查询业务系统的出差单表,查询出出差天数等信息。
通过下面的代码就可以获取activiti中所对应实例保存的业务Key。而这个业务Key一般都会保存相关联的业务操作表的主键,再通过主键ID去查询业务信息,比如通过出差单的ID,去查询更多的请假信息(出差人,出差时间,出差天数,出差目的地等)
String businessKey = processInstance.getBusinessKey();
在activiti的act_ru_execution表,字段BUSINESS_KEY就是存放业务KEY的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQRCM2az-1649212499807)(assets/1574136375409.png)]
挂起、激活流程实例
某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执行。
流程定义可以对应多个流程实例
如:每月最后一天不处理出差申请,需要挂起这个流程定义下的流程实例
当有这种流程实例没有跑完的时候,如果已经被挂起,就不能继续处理了
只有当流程实例激活后,整个流程才能继续向下处理
全部流程实例挂起
操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停:
流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行。
测试多个实例,则可以再运行一次addBusinessKey,修改1002,表示另一个人发起出差流程申请
/**
* 全部流程实例挂起与激活
*/
@Test
public void SuspendAllProcessInstance(){
// 获取流程引擎processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 查询流程定义的对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
processDefinitionKey("myEvection").
singleResult();
// 得到当前流程定义的实例是否都为暂停状态
boolean suspended = processDefinition.isSuspended();
// 流程定义id
String processDefinitionId = processDefinition.getId();
// 判断是否为暂停
if(suspended){
// 如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
repositoryService.activateProcessDefinitionById(processDefinitionId,
true,
null
);
System.out.println("流程定义:"+processDefinitionId+",已激活");
}else{
// 如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
repositoryService.suspendProcessDefinitionById(processDefinitionId,
true,
null);
System.out.println("流程定义:"+processDefinitionId+",已挂起");
}
}
操作数据库
act_ru_task
act_re_procdef
act_ru_execution
都修改了SUSPENSION_STATE_暂停状态
单个流程实例挂起
操作流程实例对象,针对单个流程执行挂起操作,某个流程实例挂起则此流程不再继续执行,完成该流程实例的当前任务将报异常。
act_hi_actinst,act_hi_identitylink,act_hi_procinst,act_hi_taskinst,act_ru_identitylink,act_ru_task,act_ru_execution这些表都有流程实例id,字段名都是PROC_INST_ID_,这里我使用act_ru_execution查询
SELECT * FROM act_ru_execution
/**
* 单个流程实例挂起与激活
*/
@Test
public void SuspendSingleProcessInstance(){
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 查询流程定义的对象
ProcessInstance processInstance = runtimeService.
createProcessInstanceQuery().
processInstanceId("2501").
singleResult();
// 得到当前流程定义的实例是否都为暂停状态
boolean suspended = processInstance.isSuspended();
// 流程定义id
String processDefinitionId = processInstance.getId();
// 判断是否为暂停
if(suspended){
// 如果是暂停,可以执行激活操作 ,参数:流程定义id
runtimeService.activateProcessInstanceById(processDefinitionId);
System.out.println("流程定义:"+processDefinitionId+",已激活");
}else{
// 如果是激活状态,可以暂停,参数:流程定义id
runtimeService.suspendProcessInstanceById( processDefinitionId);
System.out.println("流程定义:"+processDefinitionId+",已挂起");
}
}
/**
* 测试完成个人任务,测试暂停了流程实例,是否还可以继续下一步,会报错“Cannot complete a suspended task”
*/
@Test
public void completTask(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
// 完成任务,参数:流程实例id,完成zhangsan的任务
Task task = taskService.createTaskQuery()
.processInstanceId("2501")
.taskAssignee("zhangsan")
.singleResult();
System.out.println("流程实例id="+task.getProcessInstanceId());
System.out.println("任务Id="+task.getId());
System.out.println("任务负责人="+task.getAssignee());
System.out.println("任务名称="+task.getName());
taskService.complete(task.getId());
}
单个挂起或激活的数据库操作
act_ru_execution
act_ru_task