一、配环境
1.导包:
activation.jar
antlr-2.7.6.jar
asm.jar
bsh.jar
cglib.jar
commons-collections.jar
commons-logging.jar
dom4j.jar
hibernate3.jar
jboss-backport-concurrent.jar
jboss-j2ee.jar
jboss-retro-1.1.0-rt.jar
jbpm-identity.jar
jbpm-jpdl.jar
jcr-1.0.jar
log4j.jar
mysql-connector-java-5.1.5-bin.jar
2.复制四个文件,并对hibernate进行配置:
hibernate.cfg.xml
jbpm.cfg.xml
log4j.properties
流程图.zip
eclipse:将插件文件夹放在eclipse/dropins下
MyEclipse:在links目录下的com.genuitec.eclipse.MyEclipse.link文件中添加path=插件路径
2.设计流程图:
Decision节点:
判断选择功能,可以添加Handler,选择delegation,再写上处理类,处理类要实现DecisionHandler接口
Start、TaskNode、End、Transition(箭头):
可以添加Events,选择什么时候激活事件,只要在:node-leave为离开、node-enter为进入,在其中新建action,Details中选择Handler,指定处理类全名
整个流程可以用一个事件类,指第一个事件后,后面的action可以引用前面的action名称,要在action中写入前面action的名称,再选中Reference
通过TaskNode节点动态设置处理任务的员工名称:
Tasks-->New Task-->Assignment-->Handler-->写上处理类全名
处理类要实现AssignmentHandler接口,调用Assignable.setActorId("员工名称");
通过TaskNode节点动态设置处理任务的一组员工名称:
Tasks-->New Task-->Assignment-->Pooled Actors-->员工1,员工2
启动流程实例中设置,实现动态设置员工名称:
pi.getContextInstance().setVariable("键名","员工名称");
Tasks-->New Task-->Assignment-->Actor-->#{键名} //相当于jsp中的${名}
启动流程实例中设置,实现动态设置一组员工名称:
pi.getContextInstance().setVariable("actorIds", new String[] { "", "" });
Tasks-->New Task-->Assignment-->Pooled Actors-->#{键名}
3.流程定义文档par(process archive):
包括:gpd.xml、processdefinition.xml(必须有)、processimage.jpg、classes文件夹
要压缩成.zip格式
加载hibernate.cfg.xml文件,并在数据库中建表:
new Configuration().configure().buildSessionFactory();
2.部署流程定义
读取jbpm.cfg.xml文件:
JbpmConfiguration cfg = JbpmConfiguration.getInstance();
打开Session,并开始事务:
JbpmContext jbpmContext = cfg.createJbpmContext();
解析"流程图.zip"文件:
ProcessDefinition pd = ProcessDefinition.parseParResource("流程图.zip");
ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zipInputStream);
解析流程图包中的processdefinition.xml文件:
ProcessDefinition pd = ProcessDefinition.parseXmlResource("processdefinition.xml");
ProcessDefinition pd = ProcessDefinition.parseXmlInputStream(inputStream);
ProcessDefinition pd = ProcessDefinition.parseXmlReader(reader);
解析xml字符串:
ProcessDefinition pd = ProcessDefinition.parseXmlString(xmlString);
将流程保存到数据库表中(部署流程):
jbpmContext.deployProcessDefinition(pd);
jbpmContext.getGraphSession().deployProcessDefinition(pd);
回滚事务:
jbpmContext.setRollbackOnly();
提交或回滚 事务,并关闭Session:
jbpmContext.close();
3.显示流程定义
返回所有流程:
List<ProcessDefinition> list = jbpmContext.getGraphSession().findAllProcessDefinitions();
返回所有最新版本的流程:
List<ProcessDefinition> list = jbpmContext.getGraphSession().findLatestProcessDefinitions();
4.删除流程
删除指定id的流程:
jbpmContext.getGraphSession().deleteProcessDefinition(id值);
5.启动流程实例
获取指定流程名称的最新的版本:
ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("流程名");
创建一个指定流程的实例:
ProcessInstance pi = pd.createProcessInstance();
设置流程变量:
pi.getContextInstance().setVariable("变量名","值");
设置一组流程变量:
pi.getContentInstance().setVariable("变量名",new String[]{值1,值2});
离开开始节点,让指针跳到下一个节点:
pi.getRootToken().signal();
6.显示待办任务列表
查出该员工的未完成的任务列表:
List<TaskInstance> list = jbpmContext.getTaskList("员工名");
List<TaskInstance> list = jbpmContext.getTaskMgmtSession().findTaskInstances("员工名");
得到该流程实例的所有任务:
Collection<TaskInstance> taskInstances= pi.getTaskMgmtInstance().getTaskInstances();
TaskInstance ti = taskInstances.iterator().next(); //得到第一个任务实例,这方法用于自动执行开始任务用
查出属于小组任务列表:
List<TaskInstance> list = jbpmContext.getTaskMgmtSession().findPooledTaskInstances("该小组员工名");
7.办理任务
创建任务实例:
TaskInstance ti = jbpmContext.getTaskInstance("任务id");
TaskInstance ti = jbpmContext.getTaskMgmtSession().getTaskInstance("任务id");
将小组任务分配给某个员工(执行此操作后,该任务只属该员工,在小组中再无此任务):
TaskInstance ti = jbpmContext.getTaskInstance("小组任务id");
ti.setActorId("员工名");
获取流程变量值:
pi.getContextInstance().getVariable("变量名");
开始任务:
ti.start();
结束任务:
ti.end();
1.导包:
activation.jar
antlr-2.7.6.jar
asm.jar
bsh.jar
cglib.jar
commons-collections.jar
commons-logging.jar
dom4j.jar
hibernate3.jar
jboss-backport-concurrent.jar
jboss-j2ee.jar
jboss-retro-1.1.0-rt.jar
jbpm-identity.jar
jbpm-jpdl.jar
jcr-1.0.jar
log4j.jar
mysql-connector-java-5.1.5-bin.jar
2.复制四个文件,并对hibernate进行配置:
hibernate.cfg.xml
jbpm.cfg.xml
log4j.properties
流程图.zip
二、设计流程
1.安装jbpm-jpdl插件:eclipse:将插件文件夹放在eclipse/dropins下
MyEclipse:在links目录下的com.genuitec.eclipse.MyEclipse.link文件中添加path=插件路径
2.设计流程图:
Decision节点:
判断选择功能,可以添加Handler,选择delegation,再写上处理类,处理类要实现DecisionHandler接口
Start、TaskNode、End、Transition(箭头):
可以添加Events,选择什么时候激活事件,只要在:node-leave为离开、node-enter为进入,在其中新建action,Details中选择Handler,指定处理类全名
整个流程可以用一个事件类,指第一个事件后,后面的action可以引用前面的action名称,要在action中写入前面action的名称,再选中Reference
通过TaskNode节点动态设置处理任务的员工名称:
Tasks-->New Task-->Assignment-->Handler-->写上处理类全名
处理类要实现AssignmentHandler接口,调用Assignable.setActorId("员工名称");
通过TaskNode节点动态设置处理任务的一组员工名称:
Tasks-->New Task-->Assignment-->Pooled Actors-->员工1,员工2
启动流程实例中设置,实现动态设置员工名称:
pi.getContextInstance().setVariable("键名","员工名称");
Tasks-->New Task-->Assignment-->Actor-->#{键名} //相当于jsp中的${名}
启动流程实例中设置,实现动态设置一组员工名称:
pi.getContextInstance().setVariable("actorIds", new String[] { "", "" });
Tasks-->New Task-->Assignment-->Pooled Actors-->#{键名}
3.流程定义文档par(process archive):
包括:gpd.xml、processdefinition.xml(必须有)、processimage.jpg、classes文件夹
要压缩成.zip格式
三、用jbpm框架操作流程
1.建表加载hibernate.cfg.xml文件,并在数据库中建表:
new Configuration().configure().buildSessionFactory();
2.部署流程定义
读取jbpm.cfg.xml文件:
JbpmConfiguration cfg = JbpmConfiguration.getInstance();
打开Session,并开始事务:
JbpmContext jbpmContext = cfg.createJbpmContext();
解析"流程图.zip"文件:
ProcessDefinition pd = ProcessDefinition.parseParResource("流程图.zip");
ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zipInputStream);
解析流程图包中的processdefinition.xml文件:
ProcessDefinition pd = ProcessDefinition.parseXmlResource("processdefinition.xml");
ProcessDefinition pd = ProcessDefinition.parseXmlInputStream(inputStream);
ProcessDefinition pd = ProcessDefinition.parseXmlReader(reader);
解析xml字符串:
ProcessDefinition pd = ProcessDefinition.parseXmlString(xmlString);
将流程保存到数据库表中(部署流程):
jbpmContext.deployProcessDefinition(pd);
jbpmContext.getGraphSession().deployProcessDefinition(pd);
回滚事务:
jbpmContext.setRollbackOnly();
提交或回滚 事务,并关闭Session:
jbpmContext.close();
3.显示流程定义
返回所有流程:
List<ProcessDefinition> list = jbpmContext.getGraphSession().findAllProcessDefinitions();
返回所有最新版本的流程:
List<ProcessDefinition> list = jbpmContext.getGraphSession().findLatestProcessDefinitions();
4.删除流程
删除指定id的流程:
jbpmContext.getGraphSession().deleteProcessDefinition(id值);
5.启动流程实例
获取指定流程名称的最新的版本:
ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("流程名");
创建一个指定流程的实例:
ProcessInstance pi = pd.createProcessInstance();
设置流程变量:
pi.getContextInstance().setVariable("变量名","值");
设置一组流程变量:
pi.getContentInstance().setVariable("变量名",new String[]{值1,值2});
离开开始节点,让指针跳到下一个节点:
pi.getRootToken().signal();
6.显示待办任务列表
查出该员工的未完成的任务列表:
List<TaskInstance> list = jbpmContext.getTaskList("员工名");
List<TaskInstance> list = jbpmContext.getTaskMgmtSession().findTaskInstances("员工名");
得到该流程实例的所有任务:
Collection<TaskInstance> taskInstances= pi.getTaskMgmtInstance().getTaskInstances();
TaskInstance ti = taskInstances.iterator().next(); //得到第一个任务实例,这方法用于自动执行开始任务用
查出属于小组任务列表:
List<TaskInstance> list = jbpmContext.getTaskMgmtSession().findPooledTaskInstances("该小组员工名");
7.办理任务
创建任务实例:
TaskInstance ti = jbpmContext.getTaskInstance("任务id");
TaskInstance ti = jbpmContext.getTaskMgmtSession().getTaskInstance("任务id");
将小组任务分配给某个员工(执行此操作后,该任务只属该员工,在小组中再无此任务):
TaskInstance ti = jbpmContext.getTaskInstance("小组任务id");
ti.setActorId("员工名");
获取流程变量值:
pi.getContextInstance().getVariable("变量名");
开始任务:
ti.start();
结束任务:
ti.end();