Jbpm流程管理实例(二)

 

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();
	
	@Test
	public 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:

@Test
	public 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:

@Test
	public 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:

@Test
	public 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;

                            }

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值