Activiti5第七弹,自己实现一个ProcessEngineConfiguration同时自定义拦截器
生活随笔
收集整理的這篇文章主要介紹了
Activiti5第七弹,自己实现一个ProcessEngineConfiguration同时自定义拦截器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先是我自己定義的MyProcessEngineConfiguration的activiti.cfg.xml文件的內容
<?xml version="1.0"?> <beans default-lazy-init="false"xsi:schemaLocation=" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"><!-- DBCP數據庫 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/activi1"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean><!--processEngineConfiguration--><bean class="org.mpc.final_activiti.MyProcessEngineConfiguration"id="myProcessEngineConfiguration"><!-- 數據庫配置方式一:直接使用jdbc的各種屬性來配置,全部交給了activiti <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activi1" /><property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /><property name="jdbcPassword" value="root" /> --><!-- 數據庫配置方式二:將數據庫的各種配置交給DBCP,然后activiti只配置DBCP數據庫 --><property name="dataSource" ref="dataSource"></property><!-- 郵箱相關配置 START--><property name="mailServerHost" value="smtp.163.com" /><property name="mailServerPort" value="25" /><property name="mailServerUsername" value="15203437412"></property><property name="mailServerPassword" value="aa5524929"></property><property name="mailServerDefaultFrom" value="15203437412@163.com"></property><!-- 郵箱相關配置 END --><!-- 設置流程引擎啟動和關閉時數據庫執行的策略有一下三個值:false Activiti在啟動時,會對比數據庫中保存的版本,如果沒有表或者版本不匹配,將在啟動時拋出異常。true Activiti在啟動時,會對數據庫中所有表進行更新,如果表不存在,則Activiti會自動創建。create-drop Activiti在啟動時會執行表的創建工作,在關閉時會執行表的刪除工作。--><property name="databaseSchemaUpdate" value="true" /><!-- 制定要使用的數據庫類型 --><property name="databaseType" value="mysql"></property><!-- 啟動或關閉jobexecutor --><property name="jobExecutorActivate" value="true" /><!-- 保存流程相關的歷史數據none 不保存任何歷史數據,因此在流程執行中,這是最高效的。 0activity 級別高于none,保存流程實例與流程行為,其他數據不保存。 1audit 在前者的基礎上,還會保存全部的流程任務極其屬性。 2 full 保存歷史數據的最高級別,除了會保存audit級別的數據外,還會保存其他全部流程相關的細節數據,包括一些流程參數等。 3--><property name="history" value="full"></property><!-- 這是我自定義的processEngineConfiguration中的一個屬性,在這里進行注入 --><property name="name" value="mpc_test"></property></bean> </beans>和默認的ProcessEngineConfiguration配置不同的是,這里多了一個屬性,名為name。這個name就是我自己的ProcessEngineConfiguration中定義的屬性,在這里進行注入
然后是XML文件中定義的BEAN所對應的org.mpc.final_activiti.MyProcessEngineConfiguration類
package org.mpc.final_activiti;import java.util.ArrayList; import java.util.Collection; import java.util.List;import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.engine.impl.interceptor.CommandContextInterceptor; import org.activiti.engine.impl.interceptor.CommandInterceptor; import org.activiti.engine.impl.interceptor.LogInterceptor;public class MyProcessEngineConfiguration extendsProcessEngineConfigurationImpl {// 要注入到自定義的ProcessEngineConfiguration中的屬性private String name;public MyProcessEngineConfiguration() {}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected CommandInterceptor createTransactionInterceptor() {// 這個是Activiti5的ProcessEngineConfigurationImpl中定義的抽象方法,子類實現后可以向流程中添加一個自己定義的攔截器return new MyInterceptorA();}@Overrideprotected Collection<? extends CommandInterceptor> getDefaultCommandInterceptors() {// 重寫父類的這個方法List<CommandInterceptor> interceptors = new ArrayList<CommandInterceptor>();interceptors.add(new LogInterceptor()); <span style="white-space:pre"> </span>//這里調用了上面的方法,把MyInterceptorA加入了責任鏈CommandInterceptor transactionInterceptor = createTransactionInterceptor();if (transactionInterceptor != null) {interceptors.add(transactionInterceptor);}// 在這里我們就可以添加任意多的攔截器了,比起Activiti5留給我們的只能添加一個攔截器的方法要實用interceptors.add(new MyInterceptorC());interceptors.add(new MyInterceptorB());// 默認的攔截器,是用來執行SQL腳本的interceptors.add(new CommandContextInterceptor(commandContextFactory,this));return interceptors;}}
package org.mpc.final_activiti;import org.activiti.engine.impl.interceptor.Command; import org.activiti.engine.impl.interceptor.CommandConfig; import org.activiti.engine.impl.interceptor.CommandContextInterceptor;/*** * * 繼承CommandContextInterceptor,實現execute方法--使用的是責任鏈設計模式* * * */ public class MyInterceptorA extends CommandContextInterceptor {@Overridepublic <T> T execute(CommandConfig config, Command<T> command) {System.out.println("this is interceptor A "+ command.getClass().getName() + " "+ config.getClass().getName());return next.execute(config, command);} }
MyInterceptorB,MyInterceptorC的實現和MyInterceptorA一樣,只是在輸出的時候改成了B,C。
最后是測試代碼
package final_activiti.progress;import java.util.HashMap; import java.util.Map;import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Assert; import org.junit.Test; import org.mpc.final_activiti.MyProcessEngineConfiguration;public class ConfigurationTest {@Testpublic void test() {MyProcessEngineConfiguration configuration = (MyProcessEngineConfiguration) ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("my_config.xml","myProcessEngineConfiguration");ProcessEngine p = configuration.buildProcessEngine();RepositoryService repositoryService = p.getRepositoryService();RuntimeService runtimeService = p.getRuntimeService();//這里我隨便找了一個流程圖部署repositoryService.createDeployment().addClasspathResource("final_activiti/progress/RecAndManulTask.bpmn").deploy();Map<String, Object> map = new HashMap<String, Object>();map.put("123", configuration.getName());Assert.assertTrue("mpc_test".equals(configuration.getName()));ProcessInstance pi = runtimeService.startProcessInstanceByKey("processRM", map);runtimeService.signal(pi.getId());}}測試結果,在junit中是綠色的,沒問題。在控制臺的輸出如下: 一月 23, 2015 9:50:17 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [my_config.xml] this is interceptor A org.activiti.engine.impl.SchemaOperationsProcessEngineBuild org.activiti.engine.impl.interceptor.CommandConfig this is interceptor C org.activiti.engine.impl.SchemaOperationsProcessEngineBuild org.activiti.engine.impl.interceptor.CommandConfig this is interceptor B org.activiti.engine.impl.SchemaOperationsProcessEngineBuild org.activiti.engine.impl.interceptor.CommandConfig 一月 23, 2015 9:50:19 上午 org.activiti.engine.impl.ProcessEngineImpl <init> 信息: ProcessEngine default created 一月 23, 2015 9:50:19 上午 org.activiti.engine.impl.jobexecutor.JobExecutor start 信息: Starting up the JobExecutor[org.activiti.engine.impl.jobexecutor.DefaultJobExecutor]. 一月 23, 2015 9:50:19 上午 org.activiti.engine.impl.jobexecutor.AcquireJobsRunnableImpl run 信息: JobExecutor[org.activiti.engine.impl.jobexecutor.DefaultJobExecutor] starting to acquire jobs this is interceptor A org.activiti.engine.impl.cmd.AcquireJobsCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor C org.activiti.engine.impl.cmd.AcquireJobsCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor B org.activiti.engine.impl.cmd.AcquireJobsCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor A org.activiti.engine.impl.cmd.DeployCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor C org.activiti.engine.impl.cmd.DeployCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor B org.activiti.engine.impl.cmd.DeployCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor A org.activiti.engine.impl.cmd.GetNextIdBlockCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor C org.activiti.engine.impl.cmd.GetNextIdBlockCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor B org.activiti.engine.impl.cmd.GetNextIdBlockCmd org.activiti.engine.impl.interceptor.CommandConfig 一月 23, 2015 9:50:19 上午 org.activiti.engine.impl.bpmn.deployer.BpmnDeployer deploy 信息: Processing resource final_activiti/progress/RecAndManulTask.bpmn this is interceptor A org.activiti.engine.impl.cmd.StartProcessInstanceCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor C org.activiti.engine.impl.cmd.StartProcessInstanceCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor B org.activiti.engine.impl.cmd.StartProcessInstanceCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor A org.activiti.engine.impl.cmd.SignalCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor C org.activiti.engine.impl.cmd.SignalCmd org.activiti.engine.impl.interceptor.CommandConfig this is interceptor B org.activiti.engine.impl.cmd.SignalCmd org.activiti.engine.impl.interceptor.CommandConfig
可以看到,定義的攔截器,按照他們加入責任鏈的順序執行了,對每一個命令都有執行
總結
以上是生活随笔為你收集整理的Activiti5第七弹,自己实现一个ProcessEngineConfiguration同时自定义拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qomolangma实现篇(三):兼容层
- 下一篇: 新增或编辑保存时出错后,页面无法再次编辑