首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Activiti 5.19.0 核心配置深度解析(二):Job Executor、緩存、事件機制

     編輯:Java 綜合教學

Activiti 5.19.0 核心配置深度解析(二):Job Executor、緩存、事件機制

2.1 新特性:Job Executor 與 Async Executor

自 5.17.0 起提供兩種異步執行器:

  • Job Executor:傳統多線程執行定時任務
  • Async Executor:推薦使用,性能更優、對資料庫更友善

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>

2.2 Job Executor 啟用控制

單元測試場景下多線程干擾測試,可通過 API 控制:

// 查詢 Job
managementService.createJobQuery().list();
// 手動執行 Job
managementService.executeJob(jobId);
// 關閉自動啟用
<property name="jobExecutorActivate" value="false"/>

2.3 Async Executor 啟用配置(推薦)

<property name="asyncExecutorEnabled" value="true"/>   <!-- 替換舊 Job Executor -->
<property name="asyncExecutorActivate" value="true"/> <!-- 引擎啟動時激活 -->

2.4 流程定義緩存配置

解析後的流程定義默認無限制緩存(HashMap + LRU),可限制數量:

<property name="processDefinitionCacheLimit" value="100"/>

支持自定義緩存實現(實現 DeploymentCache 接口):

<property name="processDefinitionCache">
    <bean class="org.activiti.MyCache"/>
</property>

2.5 日誌框架:SLF4J 統一門面

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>

2.6 MDC 上下文日誌:追蹤流程實例

5.13+ 支持在日誌中自動注入流程上下文:

  • mdcProcessDefinitionID
  • mdcProcessInstanceID
  • mdcExecutionId
  • mdcBusinessKey

Log4j 配置示例:

log4j.appender.consoleAppender.layout.ConversionPattern = 
ProcessDefinitionId=%X{mdcProcessDefinitionID} 
executionId=%X{mdcExecutionId} 
mdcProcessInstanceID=%X{mdcProcessInstanceID} 
mdcBusinessKey=%X{mdcBusinessKey} %m%n

2.7-2.11 事件機制全解析

事件監聽器實現

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);
// 注意:重啟後動態註冊失效

流程定義級監聽器(BPMN 2.0 extensionElements)

<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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved