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