一.环境搭建
1. 准备软件:
MyEclipse6.0
SQL Server
Tomcat6
Ant-1.7
jbpm-jpdl-suite-3.2.2
在MyEclipse的根目录下建立一个叫jbpmdesigner的文件夹,将D:/jbpm-jpdl-3.2.2/designer下的eclipse目录(links除外)复制到jbpmdesigner下,在MyEclipse6.0/eclipse/links下新建一个文件jbmpdesigner.link,用文本编辑器打开,加入path=C://MyEclipse6.0//jbpmdesigner,然后启动MyEclipse。在新建工程处可以看到多出了一项JBoss jBPM,如图:
说明插件安装成功。 安装成功之后设置Eclipse中JBPM的环境,Myeclipse-->window-->JBoss jBPM 如图;
点击Add,新建一个运行时环境,Name随便填,Location就是下载的D:/jbpm-jpdl-3.2.2的路径。然后应用,保存。下面我们新建JBPM工程,工程名叫jbpmdemo,目录结构如下;
新建工作流程图:
2.部署jbpm-console
在CMD中,进入jbpm-jpdl-3.2.2/deploy目录下,使用命令:ant customize.console.for.tomcat 然后我们在deploy下可以看到多出来customized和target两个文件夹,进入customized,可以看到jbpm-console.war这个文件
a、 加入必要的jar包
在jbpm-console/WEB-INF/lib下要加入以下几个jar包:jboss-j2ee.jar、commons-collections.jar、jsf-api.jar、jsf-impl.jar、jdts.jar,删除jsf-api-14.jar和jsf-impl-14.jar这两个jar包。
b、 建jBPM数据库
在jbpm-jpdl-3.2.2/db下找到jbpm.jpdl.mssql.sql,打开后删除alter table JBPM_XX和drop table JBPM_XX这些语句,在SQL Server中新建jbpm数据库,COPY剩下的sql语句,在查询分析器里粘贴,然后执行
c、 修改hibernate.cfg.xml文件
修改jbpm-jpdl-3.2.2/deploy/customized/jbpm-console/WEB-INF/classes下hibernate.cfg.xml文件:
<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:jtds:sqlserver://localhost:1433/jbpm</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">sa</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- DataSource properties (begin)
<property name="hibernate.connection.datasource">java:/JbpmDS</property>
DataSource properties (end) -->
d、修改web.xml文件
在jbpm-console/WEB-INF下打开web.xml文件,在servlet前加入以下listener
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<listener>
<listener-class>com.sun.faces.application.WebappLifecycleListener</listener-class>
</listener>
在浏览器输入http://localhost:8080/jbpm-console/,回车,进入项目
二.概念介绍
上图表达了一个抽象的流程定义(Process Definition)。之所以称之为抽象,是因为它没有表示确切的执行者。当上述的借款人被具体化为“张三”,部门主管就成为张三的部门经理“李四”,而财务则明确为“王五”的时候,这个流程定义就被具体化,成为了一个流程实例(Process Instance)。此外,过程中的相关人员我们称之为参与者(Actor);过程中需要参与者介入的环节称之为任务(Task);每个任务在流程实例中的具体化称之为任务实例(Task Instance);从一个任务(结点)到另一个任务(结点)的转化过程叫做流转(Transition);而在流程中,由程序预先设定的行为如发送邮件,我们称之为活动(Action)。
三.应用过程
结合请假流程,介绍jBPM简要过程及API:
1、定义流程(利用jPDL流程定义工具)
2、部署流程到数据库
JbpmConfiguration.getInstance().createSchema(); //创建数据库
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("test.xml");//读取流程定义文件,创建processdefinition对象
//创建jbpmContext对象,类似于hibernate session对象的功能
JbpmContext context = jbpmConfiguration.createJbpmContext()
try{
context.deployProcessDefinition(processDefinition); //部署流程到数据库
}finally{
context.close(); //context对象需要关闭
}
3、流程实例与业务数据的绑定
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateSessionFactory.getSessionFactory());
//从数据库中加载ProcessDefinition对象
ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition("流程名");
ProcessInstance processInstance = new ProcessInstance(definition); //创建一个流程实例
context.save(processInstance); //存储流程实例
QingJia qingJia = new QingJia();//即pojo类,存业务数据
qingJia.setProcessIntanceId(processInstance.getId());//绑定流程实例到业务数据
//绑定业务数据到流程实例(ContextInstance相当于一个变量的容器)
processInstance.getContextInstance().createVariable("id", qingJia.getId());
context.close();
4、通过jBPM的接口,触发流程向下执行
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateSessionFactory.getSessionFactory());
QingJia doc = (QingJia)context.getSession().load(QingJia.class, 1);
ProcessInstance processInstance = context.getProcessInstance(doc.getProcessIntanceId());
//触发流程实例走向下一步
processInstance.getRootToken().signal();
context.close();
5、通过jBPM的接口,获得流动到某个用户那里的文档(即待处理任务列表)
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateSessionFactory.getSessionFactory());
List tasks = context.getTaskMgmtSession().findTaskInstances("经理");
System.out.println("经理待审批的流程有:");
for (Iterator iter = tasks.iterator(); iter.hasNext();)
{
TaskInstance taskInstance = (TaskInstance) iter.next();
Integer id = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("id");
System.out.println(id);
}
context.close();
6、通过jBPM的接口,结束某个用户的任务(这将触发流程继续向下流动)
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSessionFactory(HibernateSessionFactory.getSessionFactory());
List tasks = context.getTaskMgmtSession().findTaskInstances("