ProcessEngineConfigurationImpl.init方法中,第一個初始化的工作是initConfigurators,對引擎配置信息進行初始化,這裏activiti允許我們自定義配置器,在初始化前後做一些自定義的配置工作。
protected void init() { initConfigurators(); configuratorsBeforeInit(); ...... configuratorsAfterInit(); } |
initConfigurators方法中會加載1、默認的Configurator, 當前使用的activiti版本5.22.0,默認打開了jmx功能,activiti-jmx中org.activiti.management.jmx.JMXConfigurator類會被作爲默認的配置器初始化到成員變量configurators中;2、通過ServiceLoader加載我們自定義的Configurator或者在spring中配置configurators屬性,需要實現ProcessEngineConfigurator接口,根據需要實現beforeInit、configure和設置權重Priority。這兩類Configurator會被集合到一個list中(allConfigurators),通過權重進行升序排序,系統默認權重10000,我們可以按照實際需求組織Configurator們的運行順序。
configuratorsBeforeInit方法中,依次遍歷排序後的allConfigurators,實際運行每個Configurator的beforeInit方法:
protected void configuratorsBeforeInit() { for (ProcessEngineConfigurator configurator : allConfigurators) { log.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority()); configurator.beforeInit(this); } } |
在init方法最後,初始化工作的結尾,調用configuratorsAfterInit方法,一次遍歷排序後的allConfigurators,實際運行每個Configurator的configure方法:
protected void configuratorsAfterInit() { for (ProcessEngineConfigurator configurator : allConfigurators) { log.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority()); configurator.configure(this); } } |
應用:
processEngineConfiguration中可以設置activiti字體,可以設置爲"宋體"、"微軟雅黑"等,項目中遇到字體問題,客戶的環境中安裝中文字體庫有缺失,這裏可以在初始化之前做一個字體校驗。
1、繼承AbstractProcessEngineConfigurator抽象類,實現beforeInit方法:
public void beforeInit(ProcessEngineConfigurationImpl processEngineConfiguration) { //獲取系統中可用的字體的名字 GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();String[] fNames = e.getAvailableFontFamilyNames(); Map<String,String> fMap = new HashMap<String,String>(); for (int i = 0; i < fNames.length; i++) { fMap.put(fNames[i],"1"); } if(fMap.get("宋體")!=null){ processEngineConfiguration.setActivityFontName("宋體"); processEngineConfiguration.setLabelFontName("宋體"); }else if(fMap.get("黑體")!=null){ processEngineConfiguration.setActivityFontName("黑體"); processEngineConfiguration.setLabelFontName("黑體"); }else{ // other 判斷 or 拋出異常 } } |
2、設置權重
public int getPriority() { return 10001; } |
3、在spring中配置Configurator
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="processEngineName" value="spring"></property> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <!-- <property name="history" value="none"></property> --> <property name="dbIdentityUsed" value="false"></property> <property name="asyncExecutorEnabled" value="true" /> <property name="asyncExecutorActivate" value="true" /> <property name="configurators"> <list> <bean class="com.xxx.MyConfiguration"></bean> </list> </property> </bean> |
4、啓動tomcat,能看到輸出信息
六月 10, 2018 9:03:10 下午 org.apache.catalina.core.ApplicationContext log 信息: No Spring WebApplicationInitializer types detected on classpath 六月 10, 2018 9:03:10 下午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring root WebApplicationContext 自定義Configurator被執行------ |