Activiti权威指南
上QQ阅读APP看书,第一时间看更新

2.9 其他方式构造引擎实例

上文分析了ProcessEngines类中的静态方法getDefaultProcessEngine实例化流程引擎的过程,但是这种创建方式存在如下两个缺陷。

(1)activiti.cfg.xml或者activiti-context.xml文件必须位于项目的classpath根目录中,否则加载不到。

(2)activiti.cfg.xml文件中流程引擎配置类的bean的id值必须是processEngine-Configuration(默认情况下)。

看到以上两个问题,难免会有疑问:配置文件的路径可以灵活变动吗?配置文件的名称可以修改吗?配置文件中流程引擎配置类的bean的id值可以是任意值吗?这也是接下来重点讲解的地方。

2.9.1 ProcessEngineConfiguration类创建引擎

ProcessEngineConfiguration类中提供了一系列创建流程引擎配置类实例对象的静态方法,从而方便客户端获取流程引擎实例对象,而无须关心其内部实现细节,这些方法的定义如代码清单2-32所示。

代码清单2-32 ProcessEngineConfiguration.java

Activiti在ProcessEngineConfiguration类中为开发者提供了丰富多彩的静态方法,用于创建流程引擎配置类实例对象,下面对该类中的方法进行总结说明。

(1)第1行定义的createProcessEngineConfigurationFromResourceDefault方法:该方法直接调用第7行定义的方法进行处理,并传入第7行定义的方法需要的两个输入参数值,通过分析传入的参数值可以得知,该方式构造流程引擎配置类实例需要的配置文件名称必须为activiti.cfg.xml并且位于classpath根目录中,配置文件中流程引擎配置类的bean的id值必须是processEngineConfiguration。

(2)第4行定义的createProcessEngineConfigurationFromResource方法:该方法直接调用第7行定义的方法进行处理,并传入第7行定义的方法需要的两个输入参数值,其中resource参数值客户端可以自定义,beanName为processEngineConfiguration对应配置文件中流程引擎配置类的bean的id值。

(3)第7行定义的createProcessEngineConfigurationFromResource方法:该方法比较灵活,resource和beanName两个输入参数值客户端均可自定义。

(4)第10行定义的createProcessEngineConfigurationFromInputStream方法:inputStream参数为配置文件的数据流,beanName必须是processEngineConfiguration(不需要传递)。

(5)第13行定义的createProcessEngineConfigurationFromInputStream方法:inputStream参数为配置文件的数据流,beanName对应配置文件中流程引擎配置类中bean的id值,两者均可自定义。

(6)第16行定义的createStandaloneProcessEngineConfiguration方法:创建Standalone-ProcessEngineConfiguration实例对象。

(7)第19行定义的createStandaloneInMemProcessEngineConfiguration方法:该方法主要用于创建StandaloneInMemProcessEngineConfiguration实例对象。

看到上面一系列的方法,可能会有这样的疑问:以上罗列的所有方法均是创建ProcessEngineConfiguration实例对象,并没有提供构造ProcessEngine实例对象的方法。其实这样的设计也不难理解,只要能够获取到ProcessEngineConfiguration实例对象,就可以直接调用该实例对象的buildProcessEngine方法创建ProcessEngine实例。

2.9.2 编程方式创建引擎

以上几种方式均是通过配置文件创建ProcessEngineConfiguration实例对象,进而通过该实例对象创建ProcessEngine实例对象,接下来讲解如何使用编程方式创建流程引擎实例,具体实现如代码清单2-33所示。

代码清单2-33 App.java

上面代码的实现逻辑非常简单,首先第2行创建ProcessEngineConfiguration实例对象,然后第4~10行为该实例对象填充属性值,最终第11行调用该实例对象的buildProcessEngine方法完成引擎实例的创建工作。