activiti源碼-2-ProcessEngineConfigurationImpl初始化

        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 拋出異常
        }
        System.out.println("自定義Configurator被執行------");
  }

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被執行------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章