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;
}