首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

转:传智播客-Jbpm(1)

2012-10-07 
转:传智播客--Jbpm(一)第一个流程学习-------------------------------1. 抽象出流程的UML图; 报销过程;2.

转:传智播客--Jbpm(一)
第一个流程学习
-------------------------------
1. 抽象出流程的UML图;
报销过程;
2. jpbl: 写一个xml文件
用来定义上述UML图;
3. 部署;
xml需要压缩为zip格式:processDefinition.zip;
不要放在中文的路径下;
4. jbpm提供了一个例子,直接部署即可看到效果;

JbpmDemo
--------------------
Process Definition

1. jbpm自己带了一个插件,可以完成
-- UML图;
-- 根据UML自动生成jbpl语言;
-- 不用再压缩成zip格式,而直接在Eclipse使用插件完成部署;
-- 插件自动将UML图保存为jpg图片后,在IE中可以直接看到这个uml流程图;
-- 每个流程,IE的webapp中可以定位到uml流程图的任务结点位置中;

----------------
练习:  使用插件完成这个WebApp


6.X
-------------------------
1.复制designer的路径名;
2. Eclipse/links:
  jbpm-jpdl.link文件
   path=path;内容
3. 重启MyEclipse;
4. 目录不要是中文,需要转移;

7.0
-----------------------------
1. pluginCon
2.cmd ->进入jar路径;
3.  set classpath=pluginConfigInfo.jar
  java cn.itcast.PluginConfigInfo "插件的目录"
  提示信息;
4. 按照提示信息完成安装;


我的第一个Jbpm部署
----------------------------------------
1. 配置MyEclipse7.0,增加jboss jbpm插件;
java cn.itcast.PluginConfigInfo "你的插件路径"
根据控制台提示信息,完成; 重启MyEclipse即可;

2. 简单的报销工作流;
(1) Web App; (2) 新建:Jboss->Process Definition; 内容放在src中;
(3) 会自动生成:src/baoxiao: gpd.xml, processdefinition.xml, processimage.jpg(UML图画完后才有);
    (4) 画UML图,自动生成xml语句;
    (5) 启动JBOSS服务器:jboss: /server/start.bat
    (6) 部署我的jbpm:MyEclipse->baoxiao: Deployment
(7) 进入主页查看:http://localhost:8080/jbpm-console
  其他的细节:在课堂讲座的笔记已经有;


进一步:工程
------------------------
1. 新建lib文件夹,添加jar包;
2. 配置文件:
-- 包结构,源码文件夹与普通文件夹
-- src: java, process, config;
-- config/hibernate.cfg.xml : 创建数据库
      /jbpm.cfg.xml
      /jbpm.mail.templates.xml
      log4j.properties;
    
  ** 一个方法:创建数据:使用单元测试;
3. 创建表:32张表;


编程实现:固定模式
---------------------------
deployProcessDefinition();
startProcessInstance();
getTaskList();
startTask();
endTask();

1. 部署流程定义:
-- 使用测试类
-- deployProcessDefinition();
-- 从文件到实体
  jbpm: ProcessDefinition;
  ProcessDefinition: parseXXX();
   可以解析各种形式的实体描述;
   如XmlString, XMLInputStream, XmlReader等等;
   无论哪个方法,都是返回ProcessDefinition对象实体;
    -- 从实体到数据库
     不建议直接操作session, 如session.save(ProcessDefinition);
  一定要使用jbpm的API:JbpmContext;
  JbpmContext.deployProcessDefinition(ProcessDefinition);
  如何获取JbpmContext对象?
   JbpmConfiguration.getInstance().createJbpmContext();
  这些核心的API类,与Hibernate相似;
  这里的事务如何控制?
   JbpmContext来控制;
   createJbpmContext()打开事务;
   JbpmContext.close()关闭事务;
 
-- 执行完毕,如何知道执行成功?
  查看数据库;
 
-- 写这个方法注意:
  JbpmConfiguration.getInstance(); --- 相当于Hibernate中的Configuration.configure()
  如果不接收参数,代表classpath下的Hibernate.cfg.xml;
  
2. 启动流程实例;
-- 过程:
  得到实体;保存进数据库;

来源:(http://blog.sina.com.cn/s/blog_5ecfe46a0100dmr5.html) - 传智播客--Jbpm(一)_hhl_bj_新浪博客
` -- API
  ProcessInstance: 如何生成?
   == 接受一个流程实例的参数;
   == ProcessDefinition.createInstance();
  
-- 保存操作:基本上同
  jbpmContext.save

-- 流程定义一定是从数据库中取出来的;
  == jbpmContext.getGraphSession().findProcessDefinition(名字,版本);
  == 可以不需要版本:默认为获取最后一个版本;

-- 所有的数据库操作都是与JbpmContext有关;

-- 获取Token(令牌),跳过start结点
  pi.getRootToken().signal();

-- 本次流程所有的任务处理完之后,表中才有结束时间列表;

3. 获取任务列表;
-- API:
  List<TaskInstance> taskList = jbpmContext.getTaskList(actorId);
  TaskInstance: id, name, actorId, create, start, end
-- 这里指的是【获取所有未完成的任务】
  首先可以获取员工张三的任务;任务完成后数据表中自动清除任务行内容;
  然后是经理李四;
  最后又是员工张三;

4. 启动任务;
-- API:
  TaskInstance.start();
-- 获取TaskInstance:
  jbpmContext.getTaskInstance(id);

5. 结束任务;
-- API:
  TaskInstance.end();
-- 获取TaskInstance:
  jbpmContext.getTaskInstance(id);


6. 异常处理:
回滚事务
   jbpmContext.setRollBackOnly();
--------------


有关细节问题;
1. 部署问题:流程档案文件
(1) 保存在本地;zip
(2) 部署到应用中去;

------------------------------------------
(1) 必须有一个processdefinition.xml文件;
  其他两个文件:
   gpd.xml: 坐标文件;
   processimage.jpg:图片文件;
(2) 实际的应用还有更多的的文件和业务逻辑等;
  比如可以加入class文件;

(3) 将原有的流程定义部分使用Eclipse部署打包为firstPD.zip;
  并把它放在first目录下;
  ProcessDefinition.parseParResource("firstPD.zip");
   
2. 流程图
(1) 结点(node)
(2) 转换(transtion)


---------------------
    一个节点有一个或多个转换;
    如审批到领款或审批直接到结束;
    有多个转换时需要指定名字;
多个转换,只会执行其中一个;
ti.end();   == 使用第一个
ti.end("to end");   == 关联上源码就可以知道参数的名字;


  ** 使用一个方法完成整个的流程;
-- 判断流程执行完毕的2种方法;
  == pi.getEnd() != null;
  == "end".equals(pi.getRootToken().getNode().getName());
  ** 单元测试完成上述判断
   Assert.assertEquals("end", currentNodeName);

-- 获取任务列表:
  pi.getTaskMgmtInstance().getTaskInstances().next();
  pi.getTaskMgmtInstance().getUnfinishedTasks(pi.getRootToken());

-- 测试:指定名字的transtion;


3. 变量
-- 业务数据:报销金额

-- 与HttpSession原理一样;
  ContextInstance = pi.getContextInstance();
  ContextInstance: get/setVariable("money", 300);
    
       if (money > 1000)
        toend;
       else
        to领款;
       
     -- 应用:
      执行过程中关联业务数据,如报销金额;
      可以设置当前登录用户的角色,配置文件的变量:如任务的actor-id:张三,李四;
       == actor-id="#{employee}"; "#{manager}";
       == 用到这个变量前需要设定值;设定的方法同上;
       == 当执行到那个任务时,会自动使用get方法获取上述变量;
        == 最晚在signal之前设定变量的值;
         课堂实验;
       
       
     -- 其他:log4j --
     log4j.rootLogger=DEBUG/ERROR, CONSOLE


第一天的测试;
=========================================================================
1. 关于分步执行流程与数据表
a> 部署流程定义
  表【jbpm_processdefinition】,【jbpm_task】
  流程的定义(名字,描述)放在表【jbpm_processdefinition】中;
  任务的定义放在表【jbpm_task】中;
  每执行一次流程定义的代码,就在这2张表中多一套数据;他们之间有外键关联关系;但是实际测试超过2次后【jbpm_task】就不再多生成表数据;
  【jbpm_processdefinition】通过版本列信息定义最新的版本;

    b> 启动流程实例
     表【jbpm_processinstance】,【jbpm_taskinstance】
     表【jbpm_processinstance】中有实例的起始时间和结束时间;此时的起始时间为程序执行的时间,结束时间为空;
     表【jbpm_taskinstance】中有关于每个任务的字段,但是第一次只有一行数据,也就是第一个任务;
  
    c> 获取任务列表
  
  
    d> 开始任务
    e> 结束任务
  
2. 部署成zip

热点排行