jbpm4源码深入分析罗创锋

jbpm4源码深入分析 
JBPM4源码分析---Configuration  hibernate主键生成策略--native(文档不满) 
JBPM源码分析---EnvironmentJBPM 2010-04-26 11:30:05 阅读105 评论7   字号:大中小 订阅 
Environment是jbpm运行期环境,他提供了jbpm的所有的服务(Service),我们通常会使用EnvironmentFactory的openEnvironment()方法来获取Environment,而jbpm的Environment用到了Threadlocal模式,他是这样定义的: 

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

static ThreadLocal<Stack<Environment>> currentEnvironmentStack = new ThreadLocal<Stack<Environment>>(); 
其中currentEnvironment 是当前的运行期环境,而currentEnvironmentStack 则提供了一个栈,可以压入多个Environment。 

public static Environment getCurrent() { 
    return currentEnvironment.get(); 

//用来获取当前的Environment 。 
  } 

其中主要的方法是用来获取服务的: 

public abstract Object get(String name); 

public abstract <T> T get(Class<T> type); 

上一次说到了Configuration,默认的构造实际上获取的是JbpmConfiguration,而这个JbpmConfiguration便实现了EnvironmentFactory接口,当JbpmConfiguration加载jbpm.default.cfg.xml配置文件的时候,他会将其中的<process-engine-context>和<transaction-context>初始化好,注入到environment中,就可以用来获取各种服务类了。 

JBPM4源码分析---ConfigurationJBPM 2010-04-26 10:00:42 阅读172 评论0   字号:大中小 订阅 
在jBPM内部是通过各种服务相互作用, 服务接口可以从ProcessEngine中获得, 所有线程和请求都可以使用同一个流程引擎对象,而ProcessEngine是由Configuration创建的.通常我们使用默认的构造进行创建: 

ProcessEngine processEngine = new Configuration().buildProcessEngine(); /** default constructor */  public Configuration() {    this((String)null);  }这个默认构造中的this((String)null)实际上调用的是另一个带String type 参数的构造方法,方式如下:public Configuration(String type) {    String implementationClassName = getImplementationClassName(type);    if (implementationClassName==null) {      throw new JbpmException("type is null");    }    impl = instantiate(implementationClassName);  }而在getImplementationClassName方法中,JBPM把Configuration实现类implementationClassName设置为一个Map,它实现了2种Configuration: implementationClassNames.put(null, "org.jbpm.pvm.internal.cfg.JbpmConfiguration"); implementationClassNames.put("spring-test", "org.jbpm.pvm.internal.cfg.SpringConfiguration"); 所以说我们通常使用的默认构造实际上是创建的org.jbpm.pvm.internal.cfg.JbpmConfiguration在JbpmConfiguration中,他继承了Configuration,实现了Context, ProcessEngine, EnvironmentFactory等接口,这个类中主要的方法就是buildProcessEngine和一些setX(),分别用来创建流程引擎和从InputStream中、 从xml字符串中、从InputSource中、 从URL中或者从文件(File)中指定配置 

请问一下,jbpm中的流程定义xml文件是如何存储到数据库中的?  该问题已经关闭: 超过15天由系统自动关闭,悬赏平分给所有参与回答的会员 
问题答案可能在这里 → 寻找更多解答 

    * 重新看待jbpm的流程定义 
    * jBPM工作流应用 
    * jBPM3.2.2源码分析---org.jbpm.db* 
    * jbpm读取流程定义文件异常 
    * 请问下有没有jbpm3.2高手在?请教几个问题 

回答 
总体过程:读取XML文件->从文件中提取所有Node,Task,Transition等并设置到对应的Domain Object中->持久化到数据库 
详细过程(代码): 
Java代码 

   1. ProcessDefinition解析流程定义文件相关方法  
   2. public static ProcessDefinition parseXmlString(String xml);  
   3. public static ProcessDefinition parseXmlInputStream(InputStream inputStream);  
   4. public static ProcessDefinition parseXmlReader(Reader reader);  
   5. ..........................................  
   6. ..........................................  

ProcessDefinition解析流程定义文件相关方法 
public static ProcessDefinition parseXmlString(String xml); 
public static ProcessDefinition parseXmlInputStream(InputStream inputStream); 
public static ProcessDefinition parseXmlReader(Reader reader); 
.......................................... 
.......................................... 

以上所有方法其实最终都会转化为对JpdlXmlReader对象的readProcessDefinition方法的调用, 
Java代码 

   1. readProcessDefinition()方法具体实现  
   2.   
   3.     // 创建一个新的流程定义对象  
   4.     processDefinition = ProcessDefinition.createNewProcessDefinition();  
   5.   
   6.     // 初始化包含的各种列表  
   7.     problems = new ArrayList();  
   8.     unresolvedTransitionDestinations = new ArrayList();  
   9.     unresolvedActionReferences = new ArrayList();     
  10.           
  11.     try {  
  12.       //把流程定义文档读到内存DOM树中  
  13.       Document document = JpdlParser.parse(inputSource, this);  
  14.       Element root = document.getRootElement();  
  15.               
  16.       // 读取流程名称  
  17.       parseProcessDefinitionAttributes(root);  
  18.         
  19.       // 读取流程描述  
  20.       String description = root.elementTextTrim("description");  
  21.       if (description!=null) {  
  22.         processDefinition.setDescription(description);  
  23.       }  
  24.   
  25.       // 一次加工:读取流程中各种信息  
  26.       readSwimlanes(root);//读取所有泳道  
  27.       readActions(root, null, null);//读取所有Action  
  28.       readNodes(root, processDefinition);//读取所有node  
  29.       readEvents(root, processDefinition);//读取所有event  
  30.       readExceptionHandlers(root, processDefinition);//读取所有异常处理器  
  31.       readTasks(root, null);//读取所有任务  
  32.   
  33.       // 二次加工:处理各种Transition和Action的引用  
  34.       resolveTransitionDestinations();  
  35.       resolveActionReferences();  
  36.       verifySwimlaneAssignments();//确认泳道的分配策略  
  37.   
  38.     } catch (Exception e) {  
  39.       log.error("couldn't parse process definition", e);  
  40.       addProblem(new Problem(Problem.LEVEL_ERROR, "couldn't parse process definition", e));  
  41.     }  
  42.       
  43.     if (Problem.containsProblemsOfLevel(problems, Problem.LEVEL_ERROR)) {  
  44.       throw new JpdlException(problems);  
  45.     }  
  46.       
  47.     if (problems!=null) {  
  48.       Iterator iter = problems.iterator();  
  49.       while (iter.hasNext()) {  
  50.         Problem problem = (Problem) iter.next();  
  51.         log.warn("process parse warning: "+problem.getDescription());  
  52.       }  
  53.     }  
  54.       
  55.     return processDefinition;//返回processDefinition对象,已经完全把xml中定义的流程转化为java中的对象,xml中的各种tag都已经转换为JBPM中的相关图形对象POJO并包含在ProcessDefinition的所包含的各种列表中  
  56.    

时间: 2024-08-29 19:36:36

jbpm4源码深入分析罗创锋的相关文章

编译ubuntu源码的时候创的rootfs_tmp文件夹时删除出现“设备或资源忙”

问题描述 编译ubuntu源码的时候创的rootfs_tmp文件夹时删除出现"设备或资源忙" 如标题所示: 编译ubuntu源码的时候创的rootfs_tmp文件夹时删除出现"设备或资源忙" 先上图.. _这样我就不明白了,手动删的话也是出现这个问题,然后我就想到某度了下,说是有其他进程用着,好吧,我就来fuser下,带上-uv 选项, 然而进程号却成了这鬼...我一下楞逼了,按照我学的linux,进程号不就是数字么? 求解求解,这是为什么,这源码我还怎么编译下去?

深入分析Android系统中SparseArray的源码_java

前言昨晚想在Android应用中增加一个int映射到String的字典表,使用HashMap实现的时候,Eclipse给出了一个警告,昨晚项目上线紧张,我直接给忽略了,今天看了一下具体的Eclipse提示如下: Use new SparseArray<String> (...) instead for better performance 这个警告的意思是使用SparseArray来替代,以获取更好的性能. 源码因为SparseArray整体代码比较简单,先把源码展示出来,然后再分析为什么使用

如何用一款小工具大大加速MySQL SQL语句优化(附源码)

作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构.设计.开发经验.著有<SQL优化最佳实践>一书.   引言   优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又会耗费DBA很多精力.于是萌发了自己编写小工具,提高优化效率的想法.   那

Thrift的代码生成器Compiler原理及源码详细解析 1 类关系图

最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就 用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇 博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为 是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是 生成代码原理都差不多,我主要分析了C++相关代码生成.关于Thrift的使用及原理.代码网上基本上 都

Android Handler、Message完全解析,带你从源码的角度彻底理解

之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会 恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 中国战队能够虎起! 开始进入正题,我们都知道,Android UI是线程不安全的,如果在子线程中尝试 进行UI操作,程序就有可能会崩溃.相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也 是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handle

Centos 5.8中用Shell脚本一键安装mysql 5.5.25源码包

最近在研究mysql集群,至少要安装部署2台或者多台mysql数据库,操作起来即麻烦又很耗时,今天根据安装步骤写了一个Shell脚本,只需执 行以下脚本就可以快速安装mysql数据库,对初学者或者想学习mysql集群的朋友非常方便,即省时,又省力. 操作系统及其mysql配置文件说明: Linux系统:Centos5.8 mysql:mysql-5.5.25tar.gz源码包 安装目录:/usr/local/mysql/ 数据目录:/data/mysql/3306/data/ 二进制日志:/da

A5源码:12月网站源码重点更新与推荐

中介交易 SEO诊断 淘宝客 云主机 技术大厅 临近年末,大家都在努力收个好尾,我们的Web开发者们也一样.一起来看一下A5源码( http://down.admin5.com )为您带来的12月最新的免费建站代码更新推荐. 社区论坛 Discuz! X1.5 发布 详细介绍与下载地址:http://down.admin5.com/php/67852.html Discuz!X1.5是康盛创想Comsenz推出的一个以社区为基础的专业建站平台,让论坛BBS.个人空间SNS.门户Portal.群组

详解Android中的Toast源码_java

Toast源码实现 Toast入口    我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生到我的代码片 Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();     makeText就是Toast的入口,我们从makeText的源码来深入理解Toast的实现.源码如下(frameworks/base/core/java/andr

2014年1月优秀源码更新集锦

中介交易 SEO诊断 淘宝客 云主机 技术大厅 对于想做网站或者正在做网站的朋友来说,选择好的建站系统并及时的升级修复是不可缺少的,好的系统可以事半功倍,大大减少工作力度,及时的升级修复则可以更好的维护网站.A5源码(http://down.admin5.com/)为大家整理了部分上月更新的系统,其中包括:企业网站.CMS.团购.博客.社区论坛等. 社区论坛 bbPress 是WordPress团队开发的一个简约优雅的小型论坛.由于 bbPress 保持了体积小,重量轻,所以速度非常快. 在版本