Activiti的使用技巧
生活随笔
收集整理的這篇文章主要介紹了
Activiti的使用技巧
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- Activiti的使用技巧
- 1、環(huán)境的搭建:activiti-spring 7.0.0+連接池+mysql
- 1.1 依賴如下:
- 1.2 連接池和數(shù)據(jù)庫(kù)配置:
- 1.3 activiti的配置,通過(guò)config文件注入的方式:
- 2、部署
- 2.1 自動(dòng)部署
- 2.2 手動(dòng)部署
- 2.3 表單介紹
- 3、創(chuàng)建流程表
- 4、開始流程
- 5、處理任務(wù)
- 5.1 獲取任務(wù)
- 5.2 處理任務(wù)
- 6、監(jiān)聽器設(shè)置:
- 6.1 class方式:填寫的是class全路徑,具體的方法通過(guò)實(shí)現(xiàn)ExecutionListener,TaskListener判斷實(shí)現(xiàn)
- 6.2 expression方式:填寫的是具體的方法,也就是class.method()
- 6.3 delegateExpression方式:處理的是eventlistener,是處理對(duì)事件的監(jiān)聽,delegateExpression的意思是:class和events描述,delegate的意思是表達(dá)的方式是不是直接告訴Expression,有通過(guò)activiti。
- 7、變量的設(shè)置:
- 8、流程的操作
- 8.1 委派任務(wù)
- 8.2 根據(jù)指定人查詢?nèi)蝿?wù)
- 8.3 根據(jù)任務(wù)擁有者查詢?nèi)蝿?wù)
- 8.4 委派人完成任務(wù)
- 8.5 將任務(wù)委派他人完成
- 8.5 掛起流程實(shí)例
- 8.6 刪除流程實(shí)例
- 8.7激活掛起的流程實(shí)例
- 8.8 激活、掛起流程定義
Activiti的使用技巧
1、環(huán)境的搭建:activiti-spring 7.0.0+連接池+mysql
1.1 依賴如下:
<properties><java.version>1.11</java.version></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>7.0.0.GA</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></dependency></dependencies>1.2 連接池和數(shù)據(jù)庫(kù)配置:
注意配置nullCatalogMeansCurrent=true,否則自動(dòng)部署時(shí),表無(wú)法創(chuàng)建成功。
spring:#業(yè)務(wù)核心數(shù)據(jù)源datasource:url: jdbc:mysql://localhost:3306/d201903290931?characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=trueusername: rootpassword: 880808driver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource#druid配置druid:#initialSizeinitialSize: 10#minPoolSizeminIdle: 10#maxPoolSizemaxActive: 100poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 100#是否自動(dòng)提交事務(wù),如果應(yīng)用中通過(guò)Spring或其他框架顯示控制事務(wù)提交則可以設(shè)置為false,否則設(shè)置為truedefaultAutoCommit: false#配置獲取連接等待超時(shí)的時(shí)間maxWait: 10000#配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位毫秒timeBetweenEvictionRunsMillis: 60000#配置一個(gè)連接在池中最小生存的時(shí)間,單位毫秒minEvictableIdleTimeMillis: 300000#連接檢測(cè)屬性配置testWhileIdle: truevalidationQuery: SELECT 'x' FROM DUALvalidationQueryTimeout: 5000connectionProperties: oracle.net.CONNECT_TIMEOUT=3000;oracle.net.READ_TIMEOUT=5000removeAbandoned: trueremoveAbandonedTimeoutMillis: 300000testOnBorrow: false1.3 activiti的配置,通過(guò)config文件注入的方式:
關(guān)注2點(diǎn):自動(dòng)部署的文件路徑,監(jiān)聽器通過(guò)bean注入。
@Configuration public class ActivitiConfig {@Autowiredprivate MyExecutionListener myExecutionListener;@Autowiredprivate MyTaskListener1 myTaskListener1;@Beanpublic ProcessEngine processEngine(DataSourceTransactionManager transactionManager, DataSource dataSource) throws IOException {SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();//自動(dòng)部署已有的流程文件Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceLoader.CLASSPATH_URL_PREFIX + "/processes/*.xml");configuration.setTransactionManager(transactionManager);configuration.setDataSource(dataSource);configuration.setDatabaseSchemaUpdate("true");configuration.setAsyncExecutorActivate(true);configuration.setHistoryLevel(HistoryLevel.FULL);configuration.setDeploymentResources(resources);Map<Object, Object> beans = new HashMap<>(10);beans.put("myExecutionListener", myExecutionListener);beans.put("myTaskListener1", myTaskListener1); /* beans.put("surveyProcessListener", surveyProcessListener);beans.put("lossVerificationProcessListener", lossVerificationProcessListener);beans.put("investigateProcessListener", investigateProcessListener);*/configuration.setBeans(beans);//configuration.setDbIdentityUsed(false);return configuration.buildProcessEngine();}@Beanpublic RepositoryService repositoryService(ProcessEngine processEngine) {return processEngine.getRepositoryService();}@Beanpublic RuntimeService runtimeService(ProcessEngine processEngine) {return processEngine.getRuntimeService();}@Beanpublic TaskService taskService(ProcessEngine processEngine) {return processEngine.getTaskService();}@Beanpublic HistoryService historyService(ProcessEngine processEngine) {return processEngine.getHistoryService();}@Beanpublic ManagementService managementService(ProcessEngine processEngine) {return processEngine.getManagementService();}//@Bean//public IdentityService identityService(ProcessEngine processEngine) { // return processEngine.getIdentityService(); // }}當(dāng)無(wú)法注入的時(shí)候,可以使用通用類,直接注入:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component;/*** @author xmaxing* @description* @date 2019-03-29 16:45*/ @Component public class SpringContextUtil implements ApplicationContextAware {// Spring應(yīng)用上下文環(huán)境@Autowiredprivate static ApplicationContext applicationContext;/*** 實(shí)現(xiàn)ApplicationContextAware接口的回調(diào)方法,設(shè)置上下文環(huán)境** @param applicationContext*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {SpringContextUtil.applicationContext = applicationContext;}/*** @return ApplicationContext*/public static ApplicationContext getApplicationContext() {return applicationContext;}/*** 獲取對(duì)象** @param name* @return Object* @throws BeansException*/public static Object getBean(String name) throws BeansException {return applicationContext.getBean(name);}}2、部署
2.1 自動(dòng)部署
springboot會(huì)自動(dòng)部署,就可以直接開始流程處理了。
2.2 手動(dòng)部署
@Overridepublic boolean devlopActiviti(String folderPath, HashMap<String, String> map) {Deployment deploy = repositoryService.createDeployment()// 創(chuàng)建一個(gè)部署構(gòu)建器.addClasspathResource(folderPath + File.separator + map.get("id") + ".bpmn")// 從類路徑一次只能添加一個(gè)文件.addClasspathResource(folderPath + File.separator + map.get("id") + ".png")// 流程圖片.name(map.get("name")).category(map.get("category")).deploy();LOGGER.info("流程名稱【 {}】", deploy.getName());LOGGER.info("流程id【{}】", deploy.getId());LOGGER.info("流程類別【{}】", deploy.getCategory());return true;}@Overridepublic boolean deployActivitiByZip(String folderPath, HashMap<String, String> map) {InputStream in = this.getClass().getClassLoader().getResourceAsStream("folderPath" + File.separator + map.get("id") + ".bpmn");ZipInputStream zipInputStream = new ZipInputStream(in);Deployment deploy = repositoryService.createDeployment()// 創(chuàng)建一個(gè)部署構(gòu)建器.addZipInputStream(zipInputStream).name(map.get("name")).category(map.get("category")).deploy();LOGGER.info("流程名稱【 {}】", deploy.getName());LOGGER.info("流程id【{}】", deploy.getId());LOGGER.info("流程類別【{}】", deploy.getCategory());return true;}測(cè)試
@Testpublic void deplomentActiviti() {String folderPath = "study/activiti/diagrams/leaveBill";HashMap<String, String> map = new HashMap<>();map.put("name", "請(qǐng)假流程");// 名稱map.put("id", "leaveBill");// idmap.put("category", "辦公流程");// 類別2.3 表單介紹
ACT_RE_DEPLOYMENT(部署對(duì)象表) ACT_RE_PROCDEF(流程定義表) ACT_GE_BYTEARRAY(資源文件表) ACT_GE_PROPERTY(主鍵生成表)ACT_RE_*: 'RE'表示repository。 這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源 (圖片,規(guī)則,等等)。 ACT_RU_*: 'RU'表示runtime。 這些運(yùn)行時(shí)的表,包含流程實(shí)例,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù)。 Activiti只在流程實(shí)例執(zhí)行過(guò)程中保存這些數(shù)據(jù), 在流程結(jié)束時(shí)就會(huì)刪除這些記錄。 這樣運(yùn)行時(shí)表可以一直很小速度很快。 ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。 ACT_HI_*: 'HI'表示history。 這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例, 變量,任務(wù)等等。 ACT_GE_*: 'GE'表示general。通用數(shù)據(jù), 用于不同場(chǎng)景下,如存放資源文件。資源庫(kù)流程規(guī)則表1) act_re_deployment 部署信息表2) act_re_model 流程設(shè)計(jì)模型部署表3) act_re_procdef 流程定義數(shù)據(jù)表運(yùn)行時(shí)數(shù)據(jù)庫(kù)表1) act_ru_execution運(yùn)行時(shí)流程執(zhí)行實(shí)例表2) act_ru_identitylink運(yùn)行時(shí)流程人員表,主要存儲(chǔ)任務(wù)節(jié)點(diǎn)與參與者的相關(guān)信息3) act_ru_task運(yùn)行時(shí)任務(wù)節(jié)點(diǎn)表4) act_ru_variable運(yùn)行時(shí)流程變量數(shù)據(jù)表歷史數(shù)據(jù)庫(kù)表1) act_hi_actinst 歷史節(jié)點(diǎn)表2) act_hi_attachment歷史附件表3) act_hi_comment歷史意見(jiàn)表4) act_hi_identitylink歷史流程人員表5) act_hi_detail歷史詳情表,提供歷史變量的查詢6) act_hi_procinst歷史流程實(shí)例表7) act_hi_taskinst歷史任務(wù)實(shí)例表8) act_hi_varinst歷史變量表組織機(jī)構(gòu)表1) act_id_group用戶組信息表2) act_id_info用戶擴(kuò)展信息表3) act_id_membership用戶與用戶組對(duì)應(yīng)信息表4) act_id_user用戶信息表這四張表很常見(jiàn),基本的組織機(jī)構(gòu)管理,關(guān)于用戶認(rèn)證方面建議還是自己開發(fā)一套,組件自帶的功能太簡(jiǎn)單,使用中有很多需求難以滿足通用數(shù)據(jù)表1) act_ge_bytearray二進(jìn)制數(shù)據(jù)表2) act_ge_property屬性數(shù)據(jù)表存儲(chǔ)整個(gè)流程引擎級(jí)別的數(shù)據(jù),初始化表結(jié)構(gòu)時(shí),會(huì)默認(rèn)插入三條記錄。3、創(chuàng)建流程表
startevent–>usertask1–>usertask2–>endevent
<process id="listenerTask1" name="任務(wù)監(jiān)聽器流程" isExecutable="true"><startEvent id="startevent" name="Start"><extensionElements><activiti:executionListener event="start" expression="${myExecutionListener.processStart(execution)}"></activiti:executionListener></extensionElements></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="User Task" activiti:assignee="#{createLoginName}"><extensionElements><activiti:taskListener event="complete" expression="${myTaskListener1.taskComplete(task)}"><activiti:field name="arg"><activiti:string><![CDATA[gengzhn]]></activiti:string></activiti:field></activiti:taskListener></extensionElements></userTask><sequenceFlow id="flow1" sourceRef="startevent" targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow><userTask id="usertask2" name="User Task" activiti:assignee="#{checkBywhom}"></userTask><sequenceFlow id="flow3" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow><endEvent id="endevent2" name="End"></endEvent><sequenceFlow id="flow4" sourceRef="usertask2" targetRef="endevent2"></sequenceFlow></process>4、開始流程
@Overridepublic boolean startActiviti(String processDefinitionKey, HashMap<String, Object> map) {// 取得流程實(shí)例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, map);LOGGER.info("流程(流程執(zhí)行對(duì)象實(shí)例)id【{}】", processInstance.getId());// execution對(duì)象LOGGER.info("流程實(shí)例id:【{}】", processInstance.getProcessInstanceId());// processInstance對(duì)象LOGGER.info("流程定義id【{}】", processInstance.getProcessDefinitionId());// 默認(rèn)為最新的idreturn true;} @Testpublic void startActiviti() {String processDefinitionKey = "listenerTask1";// 設(shè)置變量HashMap<String, Object> map = new HashMap<>();map.put("createLoginName", "31smart.geng.123");activitiService.startActiviti(processDefinitionKey, map);}注意:流程實(shí)例ID(process的ID),流程定義ID(process的定義描述ID),執(zhí)行對(duì)象ID(process的具體task的ID),processDefinitionKey為流程的定義的名稱。
2019-03-31 22:27:18.776 INFO 1528 --- [ main] c.e.d.service.Impl.ActivitiServiceImpl : 流程(流程執(zhí)行對(duì)象實(shí)例)id【175001】 2019-03-31 22:27:18.776 INFO 1528 --- [ main] c.e.d.service.Impl.ActivitiServiceImpl : 流程實(shí)例id:【175001】 2019-03-31 22:27:18.777 INFO 1528 --- [ main] c.e.d.service.Impl.ActivitiServiceImpl : 流程定義id【listenerTask1:10:160009】5、處理任務(wù)
5.1 獲取任務(wù)
@Overridepublic boolean getTaskByLoginName(String processDefinitionKey, String loginName) {TaskQuery taskQuery = taskService.createTaskQuery();List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskAssignee(loginName).list();for (Task task : list) {LOGGER.info("任務(wù)處理人【{}】", task.getAssignee());LOGGER.info("流程名稱【{}】", task.getName());LOGGER.info("任務(wù)id【{}】", task.getId());LOGGER.info("流程定義id【{}】", task.getProcessDefinitionId());LOGGER.info("執(zhí)行對(duì)象id【{}】", task.getExecutionId());}return true;} @Overridepublic List<Task> getTaskByDeploymentId(String deploymentId, String processDefinitionKey, String executionId,String loginName) {List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).deploymentId(deploymentId).taskAssignee(loginName).executionId(executionId).list();// 獲取當(dāng)前人的return list;}5.2 處理任務(wù)
@Overridepublic boolean startActivitiAndFinsh(String processDefinitionKey, HashMap<String, Object> map) {// 取得流程實(shí)例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, map);LOGGER.info("流程(流程執(zhí)行對(duì)象實(shí)例)id【{}】", processInstance.getId());// execution對(duì)象LOGGER.info("流程實(shí)例id:【{}】", processInstance.getProcessInstanceId());// processInstance對(duì)象LOGGER.info("流程定義id【{}】", processInstance.getProcessDefinitionId());// 默認(rèn)為最新的idLOGGER.info("流程實(shí)例id【{}】", processInstance.getSuperExecutionId());List<Task> tasks = this.getTaskByDeploymentId(processInstance.getDeploymentId(), processDefinitionKey,processInstance.getId(), (String) map.get("createLoginName"));for (Task task : tasks) {this.finshTask(task.getId());}return true;} @Testpublic void finshTask() {String taskId = "137507";// 設(shè)置變量HashMap<String, Object> map = new HashMap<>();map.put("checkBywhom", "3001smart.geng.123");activitiService.finshTask(taskId,map); // activitiService.finshTask(taskId);}6、監(jiān)聽器設(shè)置:
6.1 class方式:填寫的是class全路徑,具體的方法通過(guò)實(shí)現(xiàn)ExecutionListener,TaskListener判斷實(shí)現(xiàn)
<process id="listenerTask" name="任務(wù)監(jiān)聽器流程" isExecutable="true"><startEvent id="startevent" name="Start"><extensionElements><activiti:executionListener event="start" class="com.example.demo13.service.ActivitiListener"></activiti:executionListener></extensionElements></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="User Task" activiti:assignee="#{createLoginName}"><extensionElements><activiti:taskListener event="complete" class="com.example.demo13.service.MyTaskListener"><activiti:field name="arg"><activiti:string><![CDATA[gengzhn]]></activiti:string></activiti:field></activiti:taskListener></extensionElements> public class ActivitiListener implements ExecutionListener,TaskListener {private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiServiceImpl.class);private static final long serialVersionUID = 6200534335483960408L;private Expression arg;public Expression getArg() {return arg;}public void setArg(Expression arg) {this.arg = arg;}@Overridepublic void notify(DelegateExecution execution) {String eventName = execution.getEventName();// startif ("start".equals(eventName)) {LOGGER.info("start=========");HashMap<String, Object> map = new HashMap<>();} else if ("end".equals(eventName)) {LOGGER.info("end=========");} else if ("take".equals(eventName)) {LOGGER.info("take=========");}}@Overridepublic void notify(DelegateTask delegateTask) {// 實(shí)現(xiàn)TaskListener中的方法String eventName = delegateTask.getEventName();LOGGER.info("任務(wù)監(jiān)聽器:{}", arg.getValue(delegateTask));if ("create".endsWith(eventName)) {LOGGER.info("create=========");} else if ("assignment".endsWith(eventName)) {LOGGER.info("assignment========");} else if ("complete".endsWith(eventName)) {LOGGER.info("complete===========");} else if ("delete".endsWith(eventName)) {LOGGER.info("delete=============");}}}6.2 expression方式:填寫的是具體的方法,也就是class.method()
<process id="listenerTask1" name="任務(wù)監(jiān)聽器流程" isExecutable="true"><startEvent id="startevent" name="Start"><extensionElements><activiti:executionListener event="start" expression="${myExecutionListener.processStart(execution)}"></activiti:executionListener></extensionElements></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="User Task" activiti:assignee="#{createLoginName}"><extensionElements><activiti:taskListener event="complete" expression="${myTaskListener1.taskComplete(task)}"><activiti:field name="arg"><activiti:string><![CDATA[gengzhn]]></activiti:string></activiti:field></activiti:taskListener></extensionElements>類需要添加到bean()
Map<Object, Object> beans = new HashMap<>(10);beans.put("myExecutionListener", myExecutionListener);beans.put("myTaskListener1", myTaskListener1); /* beans.put("surveyProcessListener", surveyProcessListener);beans.put("lossVerificationProcessListener", lossVerificationProcessListener);beans.put("investigateProcessListener", investigateProcessListener);*/configuration.setBeans(beans); @Service public class MyExecutionListener {private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiServiceImpl.class);public void processStart(DelegateExecution execution) {LOGGER.info("start===================================================================");}} @Service public class MyTaskListener1 {private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiServiceImpl.class);private Expression arg;public Expression getArg() {return arg;}public void setArg(Expression arg) {this.arg = arg;}public void taskComplete(DelegateTask task) { // LOGGER.info("任務(wù)監(jiān)聽器:{}", arg.getValue(delegateTask));LOGGER.info("任務(wù)監(jiān)聽器:complete===========");}}6.3 delegateExpression方式:處理的是eventlistener,是處理對(duì)事件的監(jiān)聽,delegateExpression的意思是:class和events描述,delegate的意思是表達(dá)的方式是不是直接告訴Expression,有通過(guò)activiti。
示例如下:
<extensionElements><activiti:eventListener events="ACTIVITY_CANCELLED" delegateExpression="${surveyProcessListener}"></activiti:eventListener></extensionElements> <extensionElements><activiti:eventListener class="org.activiti.engine.test.MyEventListener" /><activiti:eventListener delegateExpression="${testEventListener}" events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" /></extensionElements> <extensionElements><activiti:eventListener class="org.activiti.engine.test.MyEventListener" entityType="task" /><activiti:eventListener delegateExpression="${testEventListener}" events="ENTITY_CREATED" entityType="task" /></extensionElements> Supported values for the entityType are: attachment, comment, execution, identity-link, job, process-instance, process-definition, task. @Service public class SurveyProcessListener implements ActivitiEventListener {}@Overridepublic void onEvent(ActivitiEvent event) {//如果流程取消if (ActivitiEventType.ACTIVITY_CANCELLED == event.getType()) {// TODO: 2019-03-08 流程取消,發(fā)送各種消息,String processInstanceId = event.getProcessInstanceId();log.info("surveyProcessListener.onEvent.ACTIVITY_CANCELLED, processInstanceId:{}", processInstanceId);}}@Overridepublic boolean isFailOnException() {return false;} }7、變量的設(shè)置:
在代理監(jiān)聽器里無(wú)法注入RuntimeService或者taskService,使用bean注入,或者使用delegateTask.setVariable
((RuntimeService)SpringContextUtil.getBean("runtimeService")).setVariable(delegateTask.getExecutionId(),"checkBywhom", "x00000000xoo");runtimeService.setVariable(delegateTask.getExecutionId(),"checkBywhom", "xxoo"); delegateTask.setVariable("checkBywhom", "xxxxxxx");LOGGER.info("complete==========="); @Overridepublic boolean setVariableByExcutionId(String executionId, boolean isLocal, HashMap<String, Object> map) {/** runtimeService.setVariablesLocal(executionId, variableName, value);** 設(shè)置本執(zhí)行對(duì)象的變量,該作用域只在當(dāng)前的executionId中 runtimeService.setVariableLocal(executionId,* variableName, value);** 可以設(shè)置對(duì)個(gè)變量,放在map中*/if (isLocal) {runtimeService.setVariablesLocal(executionId, map);} else {runtimeService.setVariables(executionId, map);}return true;}@Overridepublic Map<String, Object> getVariableByExcutionId(String executionId, boolean isLocal) {Map<String, Object> variablesMap = new HashMap<String, Object>();if (isLocal) {variablesMap = runtimeService.getVariablesLocal(executionId);} else {variablesMap = runtimeService.getVariables(executionId);}return variablesMap;}@Overridepublic boolean setVariableByTaskId(String taskId, String objectName, Object object) {taskService.setVariable(taskId, objectName, object);return true;}@Overridepublic boolean setVariableByTaskId(String taskId, boolean isLocal, HashMap<String, Object> map) {/** taskService.setVariable(taskId, variableName, value);** 設(shè)置本執(zhí)行對(duì)象的變量,該作用域只在當(dāng)前的executionId中 taskService.setVariableLocal(taskId,* variableName, value); 可以設(shè)置對(duì)個(gè)變量,放在map中*/if (isLocal) {taskService.setVariablesLocal(taskId, map);} else {taskService.setVariables(taskId, map);}return true;}@Overridepublic Map<String, Object> getVariableByTaskId(String taskId, boolean isLocal) {Map<String, Object> variablesMap = new HashMap<String, Object>();if (isLocal) {variablesMap = taskService.getVariablesLocal(taskId);} else {variablesMap = taskService.getVariables(taskId);}return variablesMap;}@Overridepublic <T> T getVariableByTaskId(String taskId, String objectName, Class<T> tClass) {T bean = (T) taskService.getVariable(taskId, objectName);return bean;}@Overridepublic boolean delegateTask(String taskId, String loginName) {taskService.delegateTask(taskId, loginName);return true;}8、流程的操作
8.1 委派任務(wù)
/*** 委派任務(wù)** @param taskId* @param loginName* @return*/boolean delegateTask(String taskId, String loginName);@Overridepublic boolean delegateTask(String taskId, String loginName) {taskService.delegateTask(taskId, loginName);return true;}/*** 指定代辦人*/@Testpublic void delegateTask() {String taskId = "2511";String loginName = "0003";activitiService.delegateTask(taskId, loginName);}8.2 根據(jù)指定人查詢?nèi)蝿?wù)
/*** 根據(jù)指定人查詢?nèi)蝿?wù)** @param processDefinitionKey* @param assignee* @return*/boolean getTaskByAssignee(String processDefinitionKey, String assignee);@Overridepublic boolean getTaskByAssignee(String processDefinitionKey, String assignee) {TaskQuery taskQuery = taskService.createTaskQuery();// 任務(wù)列表List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();// 指定辦理人for (Task task : list) {LOGGER.info("任務(wù)處理人【{}】", task.getAssignee());LOGGER.info("流程名稱【{}】", task.getName());LOGGER.info("任務(wù)id【{}】", task.getId());LOGGER.info("流程定義id【{}】", task.getProcessDefinitionId());LOGGER.info("執(zhí)行對(duì)象id【{}】", task.getExecutionId());}return true;}@Testpublic void getTaskByAssignee() {String processDefinitionKey = "delegateTask";String assignee = "0003";activitiService.getTaskByAssignee(processDefinitionKey, assignee);}8.3 根據(jù)任務(wù)擁有者查詢?nèi)蝿?wù)
/*** 根據(jù)任務(wù)擁有者查詢?nèi)蝿?wù)** @param processDefinitionKey* @param owner* @return*/ boolean getTaskByOwner(String processDefinitionKey, String owner);@Overridepublic boolean getTaskByOwner(String processDefinitionKey, String owner) {TaskQuery taskQuery = taskService.createTaskQuery();// 任務(wù)列表List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskOwner(owner).list();// 指定辦理人for (Task task : list) {LOGGER.info("任務(wù)處理人【{}】", task.getAssignee());LOGGER.info("流程名稱【{}】", task.getName());LOGGER.info("任務(wù)id【{}】", task.getId());LOGGER.info("流程定義id【{}】", task.getProcessDefinitionId());LOGGER.info("執(zhí)行對(duì)象id【{}】", task.getExecutionId());LOGGER.info("任務(wù)擁有者【{}】", task.getOwner());}return true;}@Testpublic void getTaskByOwner() {String processDefinitionKey = "delegateTask";String owner = "0003";activitiService.getTaskByOwner(processDefinitionKey, owner);}8.4 委派人完成任務(wù)
/*** 委派人完成任務(wù)** @param taskId* @param map* @return*/ boolean resolveTask(String taskId, Map<String, Object> map);@Overridepublic boolean resolveTask(String taskId, Map<String, Object> map) {taskService.resolveTask(taskId, map);return true;}/*** 正在運(yùn)行的任務(wù)表中被委派人辦理任務(wù)后任務(wù)會(huì)回到委派人 ,歷史任務(wù)表中也一樣,只是多了一個(gè)人進(jìn)行審批*/@Testpublic void resolveTask() {String taskId = "2511";Map<String, Object> map = new HashMap<>();activitiService.resolveTask(taskId, map);}8.5 將任務(wù)委派他人完成
/*** 將任務(wù)委派他人完成** @param taskId* @param assignee* @return*/ boolean trunTask(String taskId, String assignee);@Overridepublic boolean trunTask(String taskId, String assignee) {taskService.setAssignee(taskId, assignee);return true;}/*** 任務(wù)轉(zhuǎn)辦,將任務(wù)交給其他人處理*/@Testpublic void turnTask() {String taskId = "7511";String assignee = "0003";activitiService.trunTask(taskId, assignee);}8.5 掛起流程實(shí)例
/*** 掛起流程實(shí)例** @param processInstanceId* @return*/ boolean suspendProcessInstanceById(String processInstanceId);@Overridepublic boolean suspendProcessInstanceById(String processInstanceId) {runtimeService.suspendProcessInstanceById(processInstanceId);return true;}/*** 掛起流程*/@Testpublic void suspendProcess() {//SuspensionState ACTIVE = new SuspensionStateImpl(1, "active"); 激活// SuspensionState SUSPENDED = new SuspensionStateImpl(2, "suspended"); 掛起String processInstanceId = "70001";activitiService.suspendProcessInstanceById(processInstanceId);}8.6 刪除流程實(shí)例
/*** 刪除流程實(shí)例** @param processInstanceId* @param reason* @return*/ boolean deleteProcessInstance(String processInstanceId, String reason);@Overridepublic boolean deleteProcessInstance(String processInstanceId, String reason) {runtimeService.deleteProcessInstance(processInstanceId, reason);return true;}@Testpublic void deleteProcessInstance() {String processInstanceId = "70001";String reason = "刪除原因";activitiService.deleteProcessInstance(processInstanceId, reason);}8.7激活掛起的流程實(shí)例
/*** 激活流程實(shí)例(激活掛起的流程實(shí)例)** @param processInstanceId* @return*/ boolean activateProcessInstanceById(String processInstanceId);@Overridepublic boolean activateProcessInstanceById(String processInstanceId) {runtimeService.activateProcessInstanceById(processInstanceId);return true;}@Testpublic void activateProcessInstanceById(){String processInstanceId = "70001";activitiService.activateProcessInstanceById(processInstanceId);}8.8 激活、掛起流程定義
/*** 掛起流程定義** @param processDefineKey* @param cascade* @return*/ boolean suspendProcessDefineKey(String processDefineKey, boolean cascade);/*** 激活流程定義** @param processDefineKey* @param cascade* @return*/ boolean activateProcessDefinitionByKey(String processDefineKey, boolean cascade);@Overridepublic boolean suspendProcessDefineKey(String processDefineKey, boolean cascade) {repositoryService.suspendProcessDefinitionByKey(processDefineKey,cascade,new Date());return true;}@Overridepublic boolean activateProcessDefinitionByKey(String processDefineKey,boolean cascade){repositoryService.activateProcessDefinitionByKey(processDefineKey,cascade,new Date());return true;@Testpublic void suspendProcessDefineBykey(){String processDefineKey = "";boolean cascade = true;activitiService.suspendProcessDefineKey(processDefineKey,cascade);}總結(jié)
以上是生活随笔為你收集整理的Activiti的使用技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker User Guide
- 下一篇: SpringMQ的使用