现在的位置: 首页 > 综合 > 正文

jBPM初识

2013年06月23日 ⁄ 综合 ⁄ 共 4814字 ⁄ 字号 评论关闭

一.环境搭建

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除外)复制到jbpmdesignerMyEclipse6.0/eclipse/links下新建一个文件jbmpdesigner.link,用文本编辑器打开,加入path=C://MyEclipse6.0//jbpmdesigner,然后启动MyEclipse。在新建工程处可以看到多出了一项JBoss jBPM,如图:

 

说明插件安装成功。 安装成功之后设置EclipseJBPM的环境,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下可以看到多出来customizedtarget两个文件夹,进入customized,可以看到jbpm-console.war这个文件

a、             加入必要的jar

     jbpm-console/WEB-INF/lib下要加入以下几个jar包:jboss-j2ee.jarcommons-collections.jarjsf-api.jarjsf-impl.jarjdts.jar,删除jsf-api-14.jarjsf-impl-14.jar这两个jar包。

b、             jBPM数据库

jbpm-jpdl-3.2.2/db下找到jbpm.jpdl.mssql.sql,打开后删除alter table JBPM_XXdrop table JBPM_XX这些语句,在SQL Server中新建jbpm数据库,COPY剩下的sql语句,在查询分析器里粘贴,然后执行

c、             修改hibernate.cfg.xml文件

修改jbpm-jpdl-3.2.2/deploy/customized/jbpm-console/WEB-INF/classeshibernate.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.class1);   

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("

抱歉!评论已关闭.