jbpm3

共分为12种节点

1.node节点:如果该节点没有定义ACTION,则流转到该节点时不会停留,会继续往下走,如果定义ACTION,执行完ACTION后会停在该节点上,调用  token.signal后继续流转
node节点支持事件 node-enter,node-leave
2.state 节点 调用 token.signal后继续流转,否则会停下
3.tasknode 节点 该节点中可以创建多个任务 task 一个task产生一个任务实例没定义task会自动流转 state 节点只能创建一个task
TaskMgmtInstance tmg = pi.getTaskMgmtInstance();
TaskInstance startTask = tmg.createStartTaskInstance();

  任务实例生命周期  创建--开始--完成    取消--挂起

   

任务实例   挂起   表taskinstance    issuspended = true   挂起后不能操作  查询不到

isopen = true     是否关闭  关闭后不能操作 查询不到


action  当节点往下走的时候触发当前的节点的action

如果一个节点有多个任务,调用signal  会随机进入一个tasknode  根据流程实例获取token    根据token获取node,根据node获取   levaingTranstaion, 可执行的Transtaion列表

流程节点条件判断有三种方式1.在transtation 中定义变量,2在decode中定义表达式,在hadler中返回transtation ,3 继承 JbpmVariableResolver(推荐)

jbpm 自己解析流程实例变量      继承 JbpmVariableResolver   目的 不能写那么多个handler

查询单独非配给自己的私有任务列表     context.getTaskMgmtSession.findTaskInstances(actorid);
查询所属组的任务实例 context.getTaskMgmtSession.findPooledTaskInstance(actorid);
两个集合要合并 才能查看该人的所有任务 查询尚未结束的任务实例
Collection taskInstances = executionContext.getTaskMgmtInstance().getUnfinishedTasks(tonke); 会签 <task-node name = "审批" create-tasks="no" signal = "first" end-tasks="yes">
<event type="node-enter"> <action class=""> </action>
<task name="审批"> </task>
<task name="审批">
<event type = "task-end"> 在每个任务实例被结束的时候
<action class="tActionHandler">
</action>
<event>
</task>

end-tasks="yes"     有一个人审批通过后继续流转,其他人的任务都变成已完成

TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();
TaskNode tasknode = (TaskNode )executionContext.getNode();
Task task = tasknode.getTasks().iterator.next();
for(){
TaskInstance ti = tmi.createTaskInstance(task,executionContext);
ti.setActorId(username); } //----------------
Conllection allTaskInstances = tmi.getTaskInstances();//获取当前流程实例下的所有任务实例

//获取当前流程实例当前Token 的未完成的任务实例
Conllection unfinishedTasks = tmi.getUnfinishedTasks(currentToken); 利用变量表达式实现自由节点,自己解释变量JbpmVariableResolver
        //获取配置文件对象
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
//根据配置文件对象获取jbpm上下文
JbpmContext context = configuration.createJbpmContext();
//根据上下文对象获取与jbpm表打交道的GraphSession
GraphSession graphSession = context.getGraphSession();
//根据GraphSession获取流程定义对象
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("sqj");
//根据流程模板创建流程实例
ProcessInstance instance = processDefinition.createProcessInstance();
//流程实例ID
System.out.println(instance.getId());
//根据流程实例获取流程实例上下文对象 ContextInstance contextInstance = instance.getContextInstance();
contextInstance.setVariable("username", "张小三");
//根据流程实例获取任务管理器
TaskMgmtInstance taskMgmtInstance = instance.getTaskMgmtInstance(); //在开始节点中创建任务setActorId设置用户,不能在handler中设置,在handler中设置不上
context.setActorId("张小三");
//SecurityHelper.getAuthenticatedActorId();
//手动进入开始任务
TaskInstance taskInstance = taskMgmtInstance.createStartTaskInstance();
//任务实例ID
System.out.println(taskInstance.getId());
//往当前任务实例中添加任务实例参数
taskInstance.setVariable("nextname", "李四");
//结束任务向下流转
//taskInstance.setActorId("张小三");
taskInstance.end("李四审批");
context.close();

        UserHandler

        //获取当前token
Token token = executionContext.getToken();
//根据当前token获取节点
Node node = token.getNode();
System.out.println(node.getName());
if(node.getName().equals("开始")){
String tusername = (String) executionContext.getVariable("username");
System.out.println(tusername);
assignable.setActorId(tusername);
//获取当前的流程实例
//TaskInstance taskInstance = executionContext.getTaskInstance();
//taskInstance.setActorId(tusername);
}else{
String tusername = (String) executionContext.getVariable("nextname");
System.out.println(tusername);
//获取当前的流程实例
TaskInstance taskInstance = executionContext.getTaskInstance();
taskInstance.setActorId(tusername);
assignable.setActorId(tusername);
}

public static void main(String[] args) {

        //创建流程模板
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("helloword/processdefinition.xml"); //创建流程实例
ProcessInstance processInstance = new ProcessInstance(processDefinition);
//获取一个流程实例的上下文对象
//ContextInstance contextInstance = processInstance.getContextInstance();
//上下文对象存放临时流程变量和获取同名会覆盖
//contextInstance.setTransientVariable("", "");
//contextInstance.addVariables(variables);
//根据流程实例创建开始节点的任务实例
//TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
//向任务实例当中写入先关变量
//taskInstance.setVariable("money_count", "");
//结束任务实例流程的Token就进入下一节点
//taskInstance.end(); //流程节点
Token token = processInstance.getRootToken(); Node node = token.getNode(); //node节点不会触发 System.out.println(node.getName());
//节点向下流转一步
token.signal();
System.out.println(node.getName()); //判断是否结束
//token.getProcessInstance().hasEnded(); //单例,线程安全,配置文件对象
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
//主要作用创建jbpmContext上下文对象//发布流程到数据库
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
//从当前线程中获取上下文对象
//JbpmContext jbpmContext1 = jbpmConfiguration.getCurrentJbpmContext(); //创建数据库表 重新调用会重新创建
//jbpmConfiguration.createSchema();
//删除数据库表
//jbpmConfiguration.dropSchema();
//获取系统里的任务调度服务对象
//jbpmConfiguration.getJobExecutor();
//开始系统的任务调度服务
//jbpmConfiguration.startJobExecutor();
//jbpmContext.getTaskList();
//根据当前人ID获取任务列表
jbpmContext.getTaskList("");
//根据任务ID获取任务节点
TaskInstance instance = jbpmContext.getTaskInstance(11);
instance.end("同意"); //根据最新的流程名称获取流程模板 //ProcessDefinition lastDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("helloword"); }
//发布流程模板
String path = "E:/work/hello.zip"; JbpmContext context = JbpmConfiguration.getInstance().createJbpmContext(); InputStream inputStream = new FileInputStream(new File(path)); ZipInputStream zipInputStream = new ZipInputStream(inputStream); ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
context.deployProcessDefinition(processDefinition); zipInputStream.close();
inputStream.close();
context.close();
        //创建JBPM数据库表
public static void createDB(){
//JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmConfiguration configuration = JbpmConfiguration.getInstance("hibernate.cfg.xml");
//configuration.createSchema();
} /**
* 部署流程文件
* @param path
*/
public static void depFlow(String path){
//String path = "E:/liucheng/qingjia.zip";
JbpmContext context = null;
InputStream inputStream = null;
ZipInputStream zipInputStream = null;
try {
context = JbpmConfiguration.getInstance().createJbpmContext();
inputStream = new FileInputStream(new File(path));
zipInputStream = new ZipInputStream(inputStream);
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
context.deployProcessDefinition(processDefinition);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
zipInputStream.close();
inputStream.close();
context.close();
} catch (IOException e) {
e.printStackTrace();
} } } /**
* 开启流程
* @param flowName
*/
public static void startFlow(String flowName){
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition(flowName);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.createVariable("name", "张三");
processInstance.signal(); } public static void startFlow2(String flowName){
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition(flowName);
ProcessInstance pi = processDefinition.createProcessInstance();
TaskMgmtInstance tmg = pi.getTaskMgmtInstance();
TaskInstance startTask = tmg.createStartTaskInstance();
startTask.setVariableLocally("JitTaskVar", "");
startTask.end();
} /**
* 获取最新的所有流程模板
* @return
*/
public static List<ProcessDefinition> getAllLastProcessDefinitions(){
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
GraphSession graphSession = jbpmContext.getGraphSession();
List<ProcessDefinition> processDefinitions = graphSession.findLatestProcessDefinitions();
for (ProcessDefinition processDefinition : processDefinitions) {
System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名称"+processDefinition.getName());
}
jbpmContext.close();
return processDefinitions;
} /**
* 获取当前人的任务列表
* @param actorId
* @return
*/
public static List<Task> getAllTask(String actorId){
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext context = configuration.createJbpmContext();
TaskMgmtSession mgmtSession = context.getTaskMgmtSession();
List<Task> tasks = mgmtSession.findTaskInstances(actorId);
context.close();
return tasks;
} /**
* 获取所有的流程版本
* @return
*/
public static List<ProcessDefinition> getAllDefinitions(){
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext context = configuration.createJbpmContext();
GraphSession graphSession = context.getGraphSession();
List<ProcessDefinition> definitions = graphSession.findAllProcessDefinitions();
for (ProcessDefinition processDefinition : definitions) {
System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名称"+processDefinition.getName());
}
context.close();
return definitions;
} /**
* 获取当前流程的所有版本
* @return
*/
public static List<ProcessDefinition> getAllDefinitions(String defName){
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext context = configuration.createJbpmContext();
GraphSession graphSession = context.getGraphSession();
List<ProcessDefinition> definitions = graphSession.findAllProcessDefinitionVersions(defName);
for (ProcessDefinition processDefinition : definitions) {
System.out.println("流程ID: "+processDefinition.getId()+"流程版本: "+processDefinition.getVersion()+" 流程名称"+processDefinition.getName());
}
context.close();
return definitions;
}

工作流JBPM的更多相关文章

  1. 工作流--JBPM简介及开发环境搭建

    一. 工作流简介 项目中不断的接触工作流,点点滴滴积累了一些,下面把一些学习到的东西整理记录下来. 工作流一般的适用场景:公文流转.行政审批.订单处理.产品研发.制造过程等.用专业一点的语言来描述工作 ...

  2. 工作流--JBPM核心服务及表结构

    一.      使用JBPM开发工作流的一般流程 1.       jBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库.只要是Hibernate支持的数据库,jBPM就支持.数据库的初始化 ...

  3. 两款工作流JBPM和CCBPM的对比

    以国外流行的工作流jbpm4的模式与当今中国开源的ccbpm(ccflow和jflow的总称)流程引擎对照.以便让各位能够了解到中国国情的工作流引擎与国际流行的设计规则的差别.不同.与优缺点. 国外工 ...

  4. Atitit.工作流系统的本质是dsl 图形化的dsl  4gl

    Atitit.工作流系统的本质是dsl 图形化的dsl  4gl 1. 工作流系统的本质是dsl 图形化的dsl  4gl1 2. 为什么每个项目系统都需要工作流1 3. 工作流dsl与java .n ...

  5. 分享下对JAVA程序员成长之路的总结<转>

    我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见.   首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...

  6. JAVA学习路线图---(JAVA1234)

    第一阶段-Java基础   这一阶段很重要,关系到你后面阶段的学习,所以务必把这一阶段掌握好: 如果你是0基本,我推荐一本比较好的,适合初学者看的书:明日科技的<Java从入门到精通>,最 ...

  7. 【转载】分享下多年积累的对JAVA程序员成长之路的总结

    注:该文是从百度贴吧转载过来,之前看到觉得写得还不错,对Java开发学习者来说很有意义的,可以看看. 我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,不爱玩社交网站,不爱玩微博, ...

  8. GEF的MVC体系结构

    摘要: 本文首先介绍了标准的 MVC 体系构架,同时也介绍了最常见的一类 MVC 模式的变种.之后,文章重点介绍了 MVC 结构在 gef 框架中的体现与应用,以及 gef 是如何综合利用工厂模式.命 ...

  9. java学习大方向

    总结Java程序员成长之路   转载  http://bbs.javazhijia.com/topic/1bb0733f80d94aedb50cc3b66d9792b6.html 我也搞了几年JAVA ...

随机推荐

  1. mybatis查询语句获取自增主键

    第一种方式: 主键回填useGeneratedKeys 代表采用JDBC的Statment对象的getGeneratedKeys方法返回主键keyProperty 代表将用哪个POJO的属性去匹配这个 ...

  2. .net core 添加 Swagger

    1.新建一个Core项目 添加nuget包:Swashbuckle.AspNetCore 添加Startup文件: 先引用: using Swashbuckle.AspNetCore.Swagger; ...

  3. SSH之Hibernate总结篇

    Hibernate hibernate 简介: hibernate是一个开源ORM(Object/Relationship Mipping)框架,它是对象关联关系映射的持久层框架,它对JDBC做了轻量 ...

  4. MySql存储过程及函数

    存储过程和函数类似于Java中的方法. ⒈存储过程 一组预先编译好的sql语句的集合,理解成批处理语句. 好处: ①提高代码的重用性 ②简化操作 ③减少了编译次数并且减少了和数据库服务器的连接次数,提 ...

  5. 深度学习在graph上的使用

    原文地址:https://zhuanlan.zhihu.com/p/27216346 本文要介绍的这一篇paper是ICML2016上一篇关于 CNN 在图(graph)上的应用.ICML 是机器学习 ...

  6. Kafka简单使用

    前言 这几天在写 shell 脚本,学到不少,但是没啥心得之类的,有空可以写个总结(但是大概率不会发表) 现在不算很忙,想再学一点 消息队列相关知识 目前比较出名的也就 RabbitMQ 和 Kafk ...

  7. 十三.iptabled配置

    期中集群架构-第十三章-iptables防火墙网路安全实践配置========================================= 01:iptables防火墙网路安全前言介绍 学好ip ...

  8. 修正锚点跳转位置 避免头部fixed固定部分遮挡

    如下锚点标签: <div id="id1"> <span class="kkAnchor"></span> 正文正文正文正文 ...

  9. using 关键字的作用

    我们都知道可以使用using关键字引入命名空间,例如:using namespace std; using还有个作用是在子类中引入父类成员函数. 1) 当子类没有定义和父类同名的函数(virtual也 ...

  10. 使用Type.MakeGenericType,反射构造泛型类型

    有时我们会有通过反射来动态构造泛型类型的需求,该如何实现呢?举个栗子,比如我们常常定义的泛型委托Func<in T, out TResult>,当T或TResult的类型需要根据程序上下文 ...