`
ronghao
  • 浏览: 456102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
E9473dd5-1985-3883-ac98-962354ca10b3
张小庆,在路上
浏览量:8780
社区版块
存档分类
最新评论

jBPM4的运行期环境

阅读更多

      万物生长靠太阳,儿童的生长离不开土壤、空气和水,当然。应用程序也是如此,离不开数据库连接、事务、日志、消息等,这些,共同构成了应用程序的运行期环境。


      理想中的环境是什么样子的哩。好吧,一句话,召之即来,挥之即去,当需要某个服务时,ok,打个响指,该服务就准备好被调用了,调用完毕后也不用费心费力地擦屁股,不必老是提心吊胆有好事者追问:你擦了吗,确定擦了?真的确定擦了?直接丢弃给环境降解处理,自然又环保,还有个好名声叫专注领域逻辑。

一、    运行期环境就是一个餐馆
1、    提供必要的服务
作为一个餐馆,必须有厨师做饭我吃,必须有桌子和椅子。作为运行期环境同样如此,我要发消息,你得提供我发消息的Service,我要获取节点任务,你得扔给我TaskService。

2、    提供获取这些服务的统一方式
好吧,我不会亲自到厨房告诉厨师我想吃什么(因为我担心这样一来我会吃不下去),我也不会亲自到收银台给钱。这些服务有一个统一的获取方式:服务员。我想吃什么和结账,告诉服务员即可。关键是这一方式要统一,要足够简单。Spring最懒,把服务给你全部注入了,当然你也可以握住BeanFactory的纤纤细手,一个一个的get。

3、    提供特定于我线程不安全的服务
我点了一盘鱼香肉丝,隔壁也点了一盘鱼香肉丝,结果服务员让我们吃同一盘鱼香肉丝。我立刻跳起来:靠,你们的服务不是线程安全的吗?!Hibernate的Session正是属于这么一种情况,需要环境进行隔离,我的唯一职责就是吃饭!我的领域逻辑是如何优美的进餐!为此还要不断重构我吃饭的姿势哩。
好不容易吃完饭,付完款,正准备离场。服务员风度翩翩地走到我的身旁,我以为还有打折券供应,结果是:服务员小姐轻启朱唇:先生,麻烦您把吃剩的盘子清洗完毕。
崩溃!
像数据库连接的打开,关闭、事务的打开、提交等都属于运行期环境应该做的事情。

4、    其他的七七八八
杂事不少,例如统一的事件机制、权限拦截等等。

二、    jBPM4的运行期环境

好吧,先来看看如何建立jBPM4的运行期环境:

EnvironmentFactory environmentFactory = new DefaultEnvironmentFactory();
 
  ...
 
  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?
继续看:

public static Environment getCurrent();
 


static,我喜欢也。方便、快捷,不管是在地上、车上还是房顶上,随处都可调用。

那么,为什么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容器提供了查找各种服务的能力。

 

2、与线程绑定的environment
environment初始化之后,避免参数传递得一塌糊涂的方式就是将environment与线程绑定。看Environment的代码:

  static ThreadLocal<Environment> currentEnvironment = new ThreadLocal<Environment>();

  static ThreadLocal<Stack<Environment>> currentEnvironmentStack = new ThreadLocal<Stack<Environment>>();
 



是的,在openEnvironment时,有这么一行代码:

Environment.pushEnvironment(environment);
 



这样environment就与线程绑定了,可以通过Environment.getCurrent()任意调用了。

哪里有压迫,哪里就有放抗。
在environment.close()方法里:

Environment.popEnvironment();
 



OK,结束。

  • 大小: 35.1 KB
分享到:
评论
1 楼 wanii3344 2009-08-04  
哥们儿很牛B,小弟学习了。。。

相关推荐

    jBPM4的PVM实现解析

    #### 六、PVM的运行期环境 1. **JbpmConfiguration**: - 配置了PVM的运行环境,包括事务管理、环境配置等。 - 通过读取配置文件(`jbpm.cfg.xml`)来初始化这些设置。 2. **EngineIOC**: - 使用了依赖注入技术来...

    jBPM4与Spring的集成

    现在流行抱大腿,不过对眼光的要求也高。...下面分别讨论:一、 通过Spring暴露服务还记得在jBPM4的运行期环境里提到的JbpmConfiguration吗?它是整个jBPM4的入口,并且是整个应用独此一份的。通过它可

    带您了解JBPM的PVM

    2. **运行期环境**:提供了IOC(Inversion of Control)容器,如jbpm.cfg.xml中的`&lt;process-engine-context/&gt;`,用于管理对象生命周期和依赖注入。 - Environment:环境设置,包含了运行时必要的上下文信息。 ### ...

    jBPM实例开发 精品文档.docx

    本文将深入探讨如何使用jBPM进行实例开发,包括创建基本流程、使用API管理和控制运行期执行。 首先,要开始jBPM实例开发,你需要下载jbpm-3.0-[version].zip并解压,然后在Eclipse中导入项目。通过“File”-&gt;...

    应用工作流解决中国特色的流程需求

    此外,历史库中丢失了部分运行期数据属性,且未记录任务候选人的任务拾取时间,这对于绩效统计来说是个挑战。 国内人工任务密集型流程的典型特点是用户友好、表单自定义和灵活的临时动态性需求。业务用户需要能够对...

    IKExpression表达式解析器

    使其能在流程运行期获得同配置期一样灵活地对执行逻辑条件进行变更。经过扩展后的IK Expression还可以适用于各种常规业务系统的动态条件配置,如需要图形化配置应用的场合,或是模拟Excel电子表格的公式运算的场景。

    ik-expression源代码

    使其能在流程运行期获得同配置期一样灵活地对执行逻辑条件进行变更。经过扩展后的IK Expression还可以适用于各种常规业务系统的动态条件配置,如需要图形化配置应用的场合,或是模拟Excel电子表格的公式运算的场景。...

    表达式解析器 IKExpression

    使其能在流程运行期获得同配置期一样灵活地对执行逻辑条件进行变更。经过扩展后的IK Expression还可以适用于各种常规业务系统的动态条件配置,如需要图形化配置应用的场合,或是模拟Excel电子表格的公式运算的场景。...

    IK Expression V2.0

    使其能在流程运行期获得同配置期一样灵活地对执行逻辑条件进行变更。经过扩展后的IK Expression还可以适用于各种常规业务系统的动态条件配置,如需要图形化配置应用的场合,或是模拟Excel电子表格的公式运算的场景。...

    Java个人简历模板9.doc

    7. **开发工具与应用服务器**:他对Weblogic、Websphere、Tomcat等应用服务器有使用经验,这些服务器用于部署和运行Java应用,体现了他在企业级环境中的实战能力。 8. **项目经验**:在“武汉融杰商贸综合管理平台...

    30种java技术框架图

    这些框架包括了Java类加载器架构、JVM架构、Java技术体系、线程运行架构、Java编译与运行结构、JMS技术架构、JMX技术架构、Spring架构、Hibernate架构、iBatis架构、Struts1与Struts2架构、JBPM架构以及EJB技术架构...

    1、平均请求数的统计有问题? 平均请求数的计算:如果统计一分钟的qps,那么平均就是当前成功请求数/60秒 所以要准确的话,前

    2. 请求分布分析:通过分析请求在一天中的分布,了解高峰期和低谷期,以便优化资源分配。 3. 数据采样:在高负载情况下,全量统计可能会带来额外的负担,可以采用随机采样或者滑动平均等方式来降低计算复杂度。 4. ...

    liferayPortal

    这种广泛的兼容性使得Liferay能够在不同的环境中部署和运行,提高了其灵活性和可扩展性。 #### 四、数据库支持 Liferay支持多种关系型数据库管理系统,包括但不限于: - Apache Derby - IBM DB2 - Firebird - Hyper...

Global site tag (gtag.js) - Google Analytics