Jbpm流程管理实例(二)

来源:互联网 发布:工厂方法模式 java 编辑:程序博客网 时间:2024/05/17 00:03
 

5、现在让我们来测试一下:

- 创建数据库表: JbpmConfiguration.getInstance().createSchema();

- 定义流程: 参考process.xml (刚才我们定义的流程文件,我们将它拷贝到src目录下)

- 部署流程:

         * JbpmConfiguration.getInstance() - 创建jbpmConfiguration对象

         * ProcessDefinition.parseXmlResource(String); - 读取流程定义文件,创建processdefinition对象

         * jbpmConfiguration.createJbpmContext(); - 创建jbpmContext对象

         * context.deployProcessDefinition(definition); - 部署流程到数据库

         * context.close(); - 关闭context对象

 

测试代码1:

import org.jbpm.JbpmConfiguration;import org.jbpm.JbpmContext;import org.jbpm.graph.def.ProcessDefinition;import org.junit.Test;public class JbpmTest {private static JbpmConfiguration configuration = JbpmConfiguration.getInstance();@Testpublic void testDeployee() {ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("process.xml");JbpmContext context = configuration.createJbpmContext();try {//context 类似于hibernate的session对象的功能,部署流程context.deployProcessDefinition(processDefinition);} catch (Exception e) {e.printStackTrace();} finally {//需要关闭context对象context.close();}}}

- 创建公文

测试代码2:

@Testpublic void testCreateDocument() {Session session = HibernateUtils.getSession();try {session.beginTransaction();Document doc = new Document();doc.setTitle("测试公文的标题");doc.setContent("测试公文的内容");doc.setCreator("测试公文的作者");session.save(doc);session.getTransaction().commit();} catch (Exception e) {session.getTransaction().rollback();e.printStackTrace();} finally {session.close();}}

- 将公文与流程绑定(即需要创建流程实例)

         * JbpmConfiguration.getInstance() - 创建jbpmConfiguration对象

         * jbpmConfiguration.createJbpmContext(); - 创建jbpmContext对象

         * context.setSessionFactory(sessionFactory),将JBPM与程序中的session绑定

         * context.getGraphSession().findLatestProcessDefinition("流程名称");

         * new ProcessInstance(definition); - 创建流程实例

         * context.save(processInstance); - 存储流程实例

         * 在Document中添加Long processInstanceId 属性

         * context.getSession().load 操作,加载Document对象

         * document.setProcessInstanceId - 绑定流程实例到公文

         * processInstance.getContextInstance.createVariable("document",document.getId()) - 绑定公文到流程实例

测试代码3:

@Testpublic void testCreateProcessInstance() {JbpmContext context = configuration.createJbpmContext();context.setSessionFactory(HibernateUtils.getSessionFactory());//从数据库中加载ProcessDefinition对象ProcessDefinition processDefinition = context.getGraphSession().findLatestProcessDefinition("文档测试流程"); //从流程中创建一个流程实例ProcessInstance processInstance = new ProcessInstance(processDefinition);//存储流程实例context.save(processInstance);//加载公文Document doc = (Document)context.getSession().load(Document.class, 1);//绑定流程实例到公文doc.setProcessInstanceId(processInstance.getId());//绑定公文到流程实例(contextInstance 相当于一个变量的容器)processInstance.getContextInstance().createVariable("document", doc.getId());//context需要关闭context.close();}

- 公文创建者提交公文

         * (Document)context.getSession().load(Document.class, 1); - 加载公文信息

         * context.getProcessInstance(从公文中获取的流程实例ID); - 即根据流程实例ID加载流程实例

         * processInstance.getRootToken().signal(); - 触发流程往下走(即到达第一个节点)

 

- 这时候,我们可以测试一下,看看流程当前所处的节点

         * processInstance.getRootToken().getNode().getName()

 

测试代码4:

@Testpublic void testSubmitDocument() {JbpmContext context = configuration.createJbpmContext();context.setSessionFactory(HibernateUtils.getSessionFactory());//加载公文Document doc = (Document)context.getSession().load(Document.class, 1);//通过公文中的流程实例id加载流程实例ProcessInstance processInstance = context.getProcessInstance(doc.getProcessInstanceId());//触发流程实例走向下一步processInstance.getRootToken().signal();//流程当前所处的节点System.err.println(processInstance.getRootToken().getNode().getName());//context需要关闭context.close();}

- 第一个节点对应的用户登录,应该能够查询到其当前的任务(有公文等待其审批)(测试代码略)

         * List tasks = context.getTaskMgmtSession().findTaskInstances("张三"); - 查找张三的任务列表

         * 列表元素是TaskInstance实例

         * 通过:taskInstance.getProcessInstance().getContextInstance().getVariable("document"); 可以找到其绑定的公文ID

- 查找到当前的任务对应的公文之后,即可对其审批,并继续往下走

         * taskInstance.end();

- 如此,直到结束

         * processInstance.hasEnded() - 如果流程已经到达终点,本调用将返回true

 

6、集成

- JBPM与Spring集成

         * 集成JBPM与spring,需要用到第三方的集成包:spring-modules-0.8.zip

         * 将其中的spring-modules-jbpm31.jar拷贝到WEB-INF/lib下面即可

         * 集成JBPM与Spring的方法是:将JbpmConfiguration对象的创建交给Spring来完成

         * 所以,需要在spring配置文件中配置JbpmConfiguration对象的创建

                   <!-- 配置JbmpConfiguration -->

  <bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">

                                     <property name="configuration" value="classpath:jbpm.cfg.xml"></property>

                            </bean>

         * 这时候,需要jbpm.cfg.xml,这是JBPM的配置文件,我们可以从:

                     JBPM_HOME\src\jpdl\org\jbpm目录下拷贝default.jbpm.cfg.xml文件,

                     并重新命名为jbpm.cfg.xml

 

- JBPM如何实现业务逻辑类

         * 用到jbpmConfiguration对象的时候,需要注入 (<property name="jbpmConfiguration" ref="jbpmConfiguration"></property>)

         * 当我们使用JbpmContext对象来操纵JBPM的时候,需要将JbpmContext的HibernateSession对象设置为当前的HibernateSession对象

                            private JbpmContext getContext(){

                                     JbpmContext context = jbpmConfiguration.createJbpmContext();

                                     context.setSession(getSession());

                                     return context;

                            }

 

 

原创粉丝点击