自 5.17.0 起提供兩種異步執行器:
Java EE 7 環境下支持 JSR-236 容器管理的 ManagedJobExecutor/ManagedAsyncJobExecutor:
<bean id="threadFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:jboss/ee/concurrency/factory/default"/>
</bean>
<bean id="customJobExecutor" class="org.activiti.engine.impl.jobexecutor.ManagedJobExecutor">
<property name="threadFactory" ref="threadFactory"/>
</bean>
單元測試場景下多線程干擾測試,可通過 API 控制:
// 查詢 Job
managementService.createJobQuery().list();
// 手動執行 Job
managementService.executeJob(jobId);
// 關閉自動啟用
<property name="jobExecutorActivate" value="false"/>
<property name="asyncExecutorEnabled" value="true"/> <!-- 替換舊 Job Executor -->
<property name="asyncExecutorActivate" value="true"/> <!-- 引擎啟動時激活 -->
解析後的流程定義默認無限制緩存(HashMap + LRU),可限制數量:
<property name="processDefinitionCacheLimit" value="100"/>
支持自定義緩存實現(實現 DeploymentCache 接口):
<property name="processDefinitionCache">
<bean class="org.activiti.MyCache"/>
</property>
5.12+ 版本統一使用 SLF4J,需自行引入實現(如 Log4j):
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
若類路徑存在 commons-logging,需橋接到 SLF4J:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
5.13+ 支持在日誌中自動注入流程上下文:
mdcProcessDefinitionIDmdcProcessInstanceIDmdcExecutionIdmdcBusinessKeyLog4j 配置示例:
log4j.appender.consoleAppender.layout.ConversionPattern =
ProcessDefinitionId=%X{mdcProcessDefinitionID}
executionId=%X{mdcExecutionId}
mdcProcessInstanceID=%X{mdcProcessInstanceID}
mdcBusinessKey=%X{mdcBusinessKey} %m%n
public class MyEventListener implements ActivitiEventListener {
@Override
public void onEvent(ActivitiEvent event) {
switch (event.getType()) {
case JOB_EXECUTION_SUCCESS: System.out.println("Job 成功"); break;
case JOB_EXECUTION_FAILURE: System.out.println("Job 失敗"); break;
default: System.out.println("事件: " + event.getType());
}
}
@Override
public boolean isFailOnException() { return false; } // 非核心業務建議 false
}
<!-- 通用監聽器:接收所有事件 -->
<property name="eventListeners">
<list><bean class="org.activiti.MyEventListener"/></list>
</property>
<!-- 類型化監聽器:只接收特定事件 -->
<property name="typedEventListeners">
<map>
<entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE">
<list><bean class="org.activiti.MyJobEventListener"/></list>
</entry>
</map>
</property>
執行順序:先通用監聽器(按配置順序),再類型化監聽器。
runtimeService.addEventListener(listener);
runtimeService.addEventListener(listener, EventType.JOB_EXECUTION_SUCCESS);
runtimeService.removeEventListener(listener);
// 注意:重啟後動態註冊失效
<process id="testEventListeners">
<extensionElements>
<!-- 全類名方式,接收所有事件 -->
<activiti:eventListener class="org.activiti.MyEventListener"/>
<!-- Bean 表達式,只接收 Job 事件 -->
<activiti:eventListener delegateExpression="${testEventListener}"
events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE"/>
<!-- 實體類型監聽 -->
<activiti:eventListener class="org.activiti.MyEventListener" entityType="task"/>
<activiti:eventListener delegateExpression="${testEventListener}"
events="ENTITY_CREATED" entityType="task"/>
</extensionElements>
</process>
entityType 可選值:attachment, comment, execution, identity-link, job, process-instance, process-definition, task