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,结束。

jBPM4的运行期环境相关推荐

  1. Spring事务管理只对出现运行期异常进行回滚

    使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检 ...

  2. 【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...

    2019独角兽企业重金招聘Python工程师标准>>> [神奇的函数式编程语言的独特功能]Lisp 的运行期修改.编译代码,并替换当前运行版本的试验 <实用 Common Li ...

  3. 深入理解JVM虚拟机(九):运行期优化与JIT编译器

    1. JIT编译器的引入 首先我们这篇文章中所说的编译器都是指JVM的组成部分之一-即时编译器(JIT),与生成Java字节码的javac编译器要区分开来.首先我们这篇文章中所说的编译器都是指JVM的 ...

  4. Java 编译期与运行期,别傻傻分不清楚!

    来源:小小木的博客 www.cnblogs.com/wyc1994666/p/11366802.html 不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello ...

  5. Delphi常见的运行期Access Violation错误分析

    Delphi常见的运行期Access Violation错误有哪些?如何防止? 任何软件开发都会遇到这样的情况:你写好程序并测试,然后到处发送,结果用户告诉你它失败了. 你可能考虑用编译指令{$D}编 ...

  6. lisp不是函授型语言_【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...

    [神奇的函数式编程语言的独特功能]Lisp 的运行期修改.编译代码,并替换当前运行版本的试验 <实用 Common Lisp 编程>一书中提到一个 Lisp 神奇案例:运行在太空飞船上的一 ...

  7. 《Imperfect C++中文版》——1.3 运行期契约:前置条件、后置条件和不变式

    本节书摘来自异步社区出版社<Imperfect C++中文版>一书中的第1章,第1.3节,作者: [美]Matthew Wilson,更多章节内容可以访问云栖社区"异步社区&qu ...

  8. Java编译器优化与运行期优化技术浅析

    2019独角兽企业重金招聘Python工程师标准>>> 一.java编译器优化 1. JVM的编译器可以分为三个编译器:      1)  前端编译器:把.java转变为.class ...

  9. 【笔记】深入理解 Java 虚拟机:晚期(运行期)优化

    文章目录 概述 Hotspot 虚拟机内的即时编译器 解释器与编译器 编译对象与触发条件 方法调用计数器 回边计数器 编译过程 Client Compiler Server Compiler 编译优化 ...

最新文章

  1. 超全超实用的Javascript类库和jQuery插件大全之二:文字处理,表格和列表处理,实用......
  2. c语言解析xml字符串_Python XML解析和处理(三十二)
  3. 所代币代币_代币网络效应
  4. cocos2d-x之读取xml文件
  5. 基于Linux的集群系统(五) Linux集群系统的实现
  6. 【React】JSX
  7. EventBus 发布/订阅 机制的 java 实现
  8. android开发之PreferenceScreen使用详解
  9. 使用cxf开发REST服务
  10. cdn网络加速原理剖析
  11. MySQL中order by的使用
  12. 梦想,因坚持而绽放——答大学生的兴趣与行动
  13. java最后冲刺2个月校招了(XB的指导)
  14. 采访了“996背后的那些人”:孤立无援,进退两难
  15. “贵州与您相约”英文网站8月18日正式上线;大华股份助力长兴打造景区数字化管理样板 | 全球旅报...
  16. 虚拟机下解压zip类型压缩包 附各类型文件打包及压缩方式
  17. uniapp App端 实现pdf文件预览
  18. python vlookup_Python - 如何使用 Pandas 进行vLookup
  19. 网页设计中的灰色调配色技巧
  20. EasyCVR平台基于萤石云SDK接入的设备播放流程及接口调用

热门文章

  1. JQuery TreeGrid 组件详解
  2. Layui treeGrid
  3. PyQt5试验:基于QTableWidget的应用
  4. 从0开始的网游ARPG实战案例:暗黑战神(第一章至第四章:设计登陆和创建角色功能实现)
  5. 人脸识别中怎么区分人脸和照片
  6. 浅谈IC卡密码的破解方法
  7. web前端-仿优车诚品首页二级分类菜单
  8. GitHub使用gitBash配置用户名和邮箱和远程操作二
  9. WordPress调用自带的友情链接功能_只在首页显示
  10. 一步一步搭建Redis + Keepalived主从高可用之Keepalived安装配置(三)