如果我们像给任务配置监听,按照常规的做法是这样的
一个个配置,比较麻烦。
现在利用ActivitiEventListener,监听全局事件,并且可以判断不同的事件类型,进而执行不同的业务逻辑。
1.定义事件处理handler接口
用接口来定义统一约定
public interface EventHandler { void handle(ActivitiEvent event); }
2.实现不同事件
任务结束事件
*/ public class TaskCompleteListener implements EventHandler { protected Logger logger = LoggerFactory.getLogger(getClass()); @Override public void handle(ActivitiEvent event) { ActivitiEntityEventImpl eventImpl = (ActivitiEntityEventImpl) event; TaskEntity taskEntity = (TaskEntity) eventImpl.getEntity(); } }
任务创建事件
public class TaskCreateListener implements EventHandler { protected Logger logger = LoggerFactory.getLogger(getClass()); @Override public void handle(ActivitiEvent event) { ActivitiEntityEventImpl eventImpl = (ActivitiEntityEventImpl) event; TaskEntity taskEntity = (TaskEntity) eventImpl.getEntity(); }
还有很多事件,比如TASK_ASSIGNED,PROCESS_STARTED,PROCESS_COMPLETED
3.实现ActivitiEventListener
public class GlobalEventListener implements ActivitiEventListener { protected Logger logger = LoggerFactory.getLogger(getClass()); /** * 各类 Event 的处理器 */ private Map<ActivitiEventType, EventHandler> handlers = new HashMap<ActivitiEventType, EventHandler>(); @Override public void onEvent(ActivitiEvent event) { EventHandler eventHandler = handlers.get(event.getType()); if(eventHandler!=null){ eventHandler.handle(event); } } @Override public boolean isFailOnException() { return false; } public Map<ActivitiEventType, EventHandler> getHandlers() { return handlers; } public void setHandlers(Map<ActivitiEventType, EventHandler> handlers) { this.handlers = handlers; } }
4.注册事件监听
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource"/> <property name="transactionManager" ref="transactionManager"/> <property name="databaseSchemaUpdate" value="true"/> <property name="jobExecutorActivate" value="false"/> <property name="history" value="full"/> <property name="processDefinitionCacheLimit" value="10"/> <!-- 生成流程图的字体 --> <property name="activityFontName" value="宋体"/> <property name="labelFontName" value="宋体"/> <property name="annotationFontName" value="宋体"/> <!-- 自动部署 --> <property name="deploymentResources"> <list> <value>classpath*:*</value> </list> </property> <!-- <property name="idGenerator" ref="idGenerator"/>--> <property name="eventListeners"> <list> <ref bean="globalEventListener"/> </list> </property> <property name="customFormTypes"> <bean class="org.activiti.engine.impl.form.DateFormType"> <constructor-arg value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration"/> </bean> <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/> <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/> <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/> <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/> <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/> <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/> <!--流程全局事件处理器--> <bean id="globalEventListener" class="GlobalEventListener"> <property name="handlers"> <map> <entry key="TASK_CREATED"> <bean class="TaskCreateListener"/> </entry> <entry key="TASK_COMPLETED"> <bean class="TaskCompleteListener"/> </entry> </map> </property> </bean>
优点
- 这样代码清晰,业务逻辑解耦,单一职责
- 省去在bpmn.xml中配置,方便。