jBPM4的运行期环境




一、运行期环境就是一个餐馆
二、jBPM4的运行期环境
Environment environment = environmentFactory.openEnvironment();
try {
everything available in this block
} finally {
environment.close();
}

两个关键的类:EnvironmentFactory和Environment.
EnvironmentFactory是全局的,在整个应用程序中保持一个实例即可.
Environment则是每次方法调用则要new一个.
看看Environment的主要方法:
public abstract Object get(String name);
public abstract <T> T get(Class<T> type);

是的,environment为我们的代码提供所需要的服务类实例.
那么,如何获得environment?
那么,为什么Environment每次调用要new呢?
好吧,当你需要获取数据库Session的时候,是不是每次都要new呢.Environment提供的服务里包括了非线程安全的数据库操作服务.

三、 jBPM4运行期环境的实现

1、JbpmConfiguration
JbpmConfiguration是jBPM4里最重要的类,它是整个应用程序的入口.它实现了EnvironmentFactory接口.

JbpmConfiguration加载jBPM总的配置文件,还是大概扫一下这个配置文件:

<jbpm-configuration xmlns="http://jbpm.org/xsd/cfg">

<process-engine-context>
<repository-service />
<repository-cache />
<execution-service />
<history-service />
<management-service />
<identity-service />
<task-service />
<hibernate-configuration>
<cfg resource="jbpm.hibernate.cfg.xml" />
</hibernate-configuration>
<hibernate-session-factory />
</process-engine-context>

<transaction-context>
<repository-session />
<pvm-db-session />
<job-db-session />
<task-db-session />
<message-session />
<timer-session />
<history-session />
</transaction-context>

</jbpm-configuration>

配置文件被分为了两部分,分别是:process-engine-context和transaction-context.对应于两个IOC容器(WireContext)的配置文件.

作为EnvironmentFactory,JbpmConfiguration持有成品process-engine-context对应的IOC容器(全局的)实例,持有半成品transaction-context的WireDefinition.当调用openEnvironment方法时,JbpmConfiguration会new Environment,然后将process-engine-context IOC填充入environment,同时初始化transaction-context IOC,并将其也填充入environment.这样通过environment就可以获得所有所需要的服务,包括全局的和非线程安全的服务实例.也就是environment透过IOC容器提供了查找各种服务的能力.
file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temporary%20Internet%20Files/Content.IE5/AMBSBSK7/6f603207390ea3518502ce6fa53f60a0[1].png


2、与线程绑定的environment

environment初始化之后,避免参数传递得一塌糊涂的方式就是将environment与线程绑定.看Environment的代码:
是的,在openEnvironment时,有这么一行代码:
这样environment就与线程绑定了,可以通过Environment.getCurrent()任意调用了.

哪里有压迫,哪里就有放抗.

在environment.close()方法里:

Environment.popEnvironment();


OK,结束.





猜你喜欢

转载自xgbjmxn.iteye.com/blog/1108809