`

jbpm-------api介绍

    博客分类:
  • Jbpm
阅读更多
创建一个事务,jbpm都是在一个事务中完成的

JbpmContext jbpmContext =
   JbpmConfiguration.getInstance().createJbpmContext();

----中间写点东西

jbpmContext.close();

我们其实可以在web.xml里面配置一个选项,那么我们就不用创建流程和关闭流程了
   也就是
   JbpmContext jc = JbpmConfiguration.getInstance().getCurrentJbpmContext();
   代替 :
   JbpmContext jc = JbpmConfiguration.getInstance().createJbpmContext();
  
   <servlet>
     <servlet-name>CloseJbpmConfigurationServlet</servlet-name>
     <servlet-class>org.jbpm.web.CloseJbpmConfigurationServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
   </servlet>
  
   <filter>
     <filter-name>JbpmContextFilter</filter-name>
     <filter-class>org.jbpm.web.JbpmContextFilter</filter-class>
   </filter>
   <filter-mapping>
   <filter-name>JbpmContextFilter</filter-name>
   <url-pattern>*.jsp</url-pattern>
   </filter-mapping>
  
注意:loadTaskInstance和loadProcessInstance 的工作其实可以调用
jbpmContext.loadTaskInstance(123);
jbpmContext.loadProcessInstance(123);
jbpmContext.save(processInstance);
他会去委托相应的session来完成

-----------Session--------------------------------------------------------------
Session , GraphSession , TaskMgmtSession

GraphSession graphSession = jbpmContext.getGraphSession();
Session session = jbpmContext.getSession();
其中GraphSession对于维护Jbpm的表,因为jbpm的xml对我们来说就是一个图(至少eclipse中是)
而Session是管理jbpm以外的表的

所以graphSession可以部署流程定义(其实就是save到jbpm的表里面嘛)
graphSession.deployProcessDefinition(processDefinition);//部署流程定义,如果已经存在同名的定义,则版本号会自动累加
graphSession.loadProcessDefinition(processDefinitionId);
graphSession.findLastestProcessDefinition("xxx");
graphSession.saveProcessDefinition(pd);
而session可以增删改查普通数据表
session.save(qingjiaForm);
session.load(QingjiaForm.class,Long.parseLong(id));

TaskMgmtSession tackMgmtSession = jbpmContext.getTaskMgmtSession();
这个session是用来和jbpm数据库表中的与工作相关的东西打交道的

//只能获取尚未完成的任务列表
//得到这个用户的所有taskInstance,这个userId就是assigment里面的actor-id
List list = taskMgmtSession.findTaskInstance(userId);
TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(id);



---------------ProcessDefinition----------------------------------------------------------
ProcessDefinition这个对象是拥有xml信息的对象
从文件中拿到
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlResource("org/ministone/training/jbpm/processdefinition.xml");
ProcessDefinition pd = 
ProcessDefinition.parseParZipInputStream(new ZipInputStream(file.getInputStream()));  
从数据库中拿到
ProcessDefinition processDefinition =
graphSession.loadProcessDefinition(processDefinitionId);
ProcessDefinition processDefinition =
graphSession.findLastestProcessDefinition("xxx");
从字符串中拿到
ProcessDefinition processDefinition =
ProcessDefinition.parseXmlString("<xxxx><xxx>xx<xxx>");

pd.getFileDefinition().getBytes(String name); //这个是从数据库中获取文件的字节流,需要传入文件的名字
Map bytesMap = pd.getFileDefinition().getBytesMap();//得到每一个文件
ZipOutputStream zipOutputStream
    = new ZipOutputStream(resp.getOutputStream());
for(Iterator it=bytesMap.keySet().iterator();it.hasNext();){
    String fname = (String)it.next();
    byte[] filebytes = fd.getBytes(fname);
    ZipEntry zipEntry = new ZipEntry(fname); //创建一个zip文件入口
    zipOutputStream.putNextEntry(zipEntry);//使得入口和outputStream相连
    zipOutputStream.write(fileBytes);
    zipOutputStream.closeEntry();
}
zipOutputStream.finish();
zipOutputStream.flush();
zipOutputStream.close();


------------------ProcessInstance---------------------------------------------------------------
ProcessInstance是根据processDefinition给new出来的,他相当于xml的动态部分,
也就是有状态的ProcessInstance

ProcessInstance processInstance =
   new ProcessInstance(processDefinition);
jbpmContext.save(processInstance); //一般是在开始加载流程的时候弄


--------------taskInstance-----------------------------------------
if(taskInstance.getStart()==null)
taskInstance.start(); //标识一个任务的执行开始:任务的开始时间被填充,看成提交申请
//taskInstance.end();//任务结束时间被填充,下一个节点的初始化,前一个任务的结束和下一个节点的开始在一个事物内,可以看成事审批申请
jbpmContext.save(taskInstance);//记住:驱动完成之后还要save


--------------------创建数据库---------------------------------------
JbpmConfiguration.getInstance().createSchema(); //创建数据库

JbpmConfiguration.getInstance().dropSchema();

pi.signal(); 与 ti.end()的区别
  
   联系: 他们都是调用了rootToken.signal()方法,
   区别: ti.end()里面有这样一段代码
   this.end = Clock.getCurrentTime(); //这个是对时间做了处理
   而我们取代办任务列表的时候List list = taskMgmtSession.findTaskInstance(userId);
   他的依据是if(end == null){获取}他不管流程的位置的

-----------------xml----------------------------------------------------
<process-definition name="qingjia" >
<start-state name="start-state1">
<transition to="fillform"></transition>
</start-state >
    <task-node name="fillform">
       <task name="fill form">
       <assignment actor-id="1"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
       </task>
       <transition to="mgr audit"></transition>
    </task-node>
<task-node name="mgr audit">
       <task name="mgr audit">
       <assignment actor-id="2"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
       </task>
       <transition to="end-state"></transition>
    </task-node>
    <end-state name="end-state"></end-state>
</process-definition>
  
  
流程角色 swimlane
<swimlane name="starter">
<assignment actor-id="1"/>
</swimlane>
  然后
  <task name="fill form">
       <assignment actor-id="1"></assignment> //这种形式,那么这个工作fill form只固定这一个人来处理
   </task>
   就可以变成
   <task name="fill form" swimlane="starter"> 
   </task> 
  
   用变量传递参与者id
   <task-node name="collectform">
   <task>
      <assignment class="com.zwz.UserIdAssigmentHandler" /> ---通过这个类和上一个参数来动态加载这个actor-id
      <assignment actor-id="#{userid}"/>
   </task>
   <transition name="auditfork" to="auditfork" />
   </task-node>
  
   Handler 实现
   public class UserIdAssigmentHandler implements AssignmentHandler{
       public void assign(Assignable assignable,ExecutionContext executionContext){
        // String actorid = (String)executionContext.getVariable("userid");
        String currentActorId = (String)executionContext.getProcessInstance().getContextInstance().getVariable("currentId");
        //先得到当前的id,然后再通过业务逻辑,找到相应的处理者,然后设置进去
         assignable.setActorId(this.getRealActorId(currentActorId)); //把我们需要的actor-id放进去
      
       }
   }
  
    String currentActorId = (String)executionContext.getProcessInstance().getContextInstance().getVariable("currentId");
    这一句依赖于上一个页面有:
    taskInstance.getProcessInstance().getContextInstance().setVariable("currentId","34");
   
    <task>
      <assignment actor-id="#{userid}"/>
   </task>
   这样也可以
   但是在到达这个tack前需要设置
   pi.getContextInstance().setVariable("userid",xxx);
   这样的话,assignement的执行者就会被自动赋值上
  
  
   List list = ti.getTask().getTaskNode().getLeavingTransitions();
   这个可以得到TaskNode的所有trans,因为有时候会有多个trans

-----------------------------------------------------------------------
--------------节点介绍-----------------------------------
   start-state  这个节点可以指定task 但是不能指定task里面的actor
   public TaskInstance createStartTaskInstance()
    {
        TaskInstance taskInstance = null;
        Task startTask = taskMgmtDefinition.getStartTask();
        if(startTask != null)
        {
            Token rootToken = processInstance.getRootToken();
            ExecutionContext executionContext = new ExecutionContext(rootToken);
            taskInstance = createTaskInstance(startTask, executionContext);
            taskInstance.setActorId(SecurityHelper.getAuthenticatedActorId()); //这里actorId被覆盖了
        }
        return taskInstance;
    }
    那么如何设置这个被认证过的id呢?
    jbpmContext.setActorId((String)session.getAttribute("actorId"));
    TaskInstance ti = pi.getTaskMgmtInstance().createStartTaskInstance();//这里就得到了在start里面的任务
    ti.start();
    ti.end(); //一般第一个start节点就是做些初始化准备工作,所以连续的start,end
   
    在start-state里面还可以指定swimlane,而且这个swimlane都不用写assigment,因为这个任务的执行者也是通过set进去的
    <swimlane name="starter"></swimlane> 这样就可以直接用
    <start-state name="start-state1">
       <task name="填申请单" swimlane="starter" ></task>
<transition to="fillform"></transition>
</start-state >


---------------------------------------------
jbpm.cfg.xml
<jbpm-configuration>
<string name="jbpm.files.dir" value="d:/" />  ---这个配置意思是把流程定义存到指定的目录下面而不是数据库中
</jbpm-configuration>

分享到:
评论

相关推荐

    jbpm-api-4.4.jar

    jbpm-api-4.4.jar..................................................................................................................................................

    jbpm-4.4.zip part03

    jbpm还提供了API和工具,如jbpm-explorer和jbpm-console,帮助用户管理和操作流程实例。 总的来说,jbpm是一个强大的业务流程管理工具,适用于需要自动化和优化业务流程的企业或项目。jbpm 4.4版本是其历史版本中的...

    jbpm-jpdl-suite-3.2.3的安装配置

    1. **jbpm-jpdl.jar**:这是jPDL的核心程序包,包含了流程定义和运行时流程实例管理的API。它可以将流程定义存储为XML文件并在内存中管理执行过程。 2. **jbpm-jpdl-designer-3.1.2.zip**:这是一个基于Eclipse的...

    jbpm-3.1.4部署jbpm的jar包和moudle的jar包

    jbpm由几个关键部分组成,包括工作流引擎、工作流设计工具(jbpm-designer)、持久化机制(如JPA或Hibernate)、以及各种服务和API。这些组件通常被打包成不同的jar文件,以供不同功能的需求。 1. **核心jar包**:...

    jbpm-gpd-site 4.4.zip

    jbpm-gpd-site 4.4.zip 是一个与jbpm(Java Business Process Management)相关的压缩文件,它包含的是jbpm-eclipse插件的特定版本,适用于jbpm 4.4框架。jbpm是一个开源的工作流管理系统,用于设计、执行和管理业务...

    jbpm-2.0-beta1.zip_java 工作流引擎_jbpm_jbpm-demo_工作流_工作流引擎

    除了核心引擎,jbpm还提供了丰富的API和工具集,包括一个基于Web的流程设计器,使得非技术背景的业务人员也能参与到流程的设计中来。此外,jbpm还支持与其他Java企业级框架如Spring的集成,方便在现有企业应用中嵌入...

    jbpm-jpdl-3.2.3.zip

    为了使用jbpm-jpdl-3.2.3,你需要按照文档中的步骤配置环境,如添加必要的依赖,然后可以通过创建JPDL文件来定义你的业务流程,并使用jbpm提供的API或者工具启动和管理这些流程。这将帮助你实现企业的业务自动化,...

    jbpm-4.4 part03.zip

    1. **jbpm框架介绍**:jbpm是一个开源的工作流管理系统,它提供了一整套工具和服务,用于设计、部署和执行业务流程。jbpm4.4是该框架的一个早期版本,它支持BPMN(Business Process Modeling Notation)2.0标准,这...

    jbpm-4.4 part02

    在这个part02的压缩包中,可能包含的文件有流程定义文件(.bpmn或.jpdl)、配置文件、Drools规则文件、示例流程、库文件、API文档以及可能的升级或补丁。通过解压和研究这些文件,开发者可以深入理解jbpm-4.4的内部...

    jbpm-6.1.0.Final-installer

    4. **kie-server**:Kie Server是jBPM服务的运行时环境,它提供了RESTful API,使得其他应用程序和服务能远程调用jBPM的功能,如启动流程实例、查询流程状态、执行规则和决策服务等。 5. **数据存储**:jBPM使用...

    jbpm-7.3.0.Final-bin 工作流

    3. **服务API**:jbpm-services-api-7.3.0.Final.jar提供了jBPM服务的API,允许开发者与jBPM引擎进行交互,如启动流程实例、查询流程状态、干预任务处理等。 4. **审计与日志**:jbpm-audit-7.3.0.Final.jar和jbpm-...

    jbpm-5.4.0.Final

    7. **jbpm-persistence-jpa-5.4.0.Final.jar**:包含了对JPA(Java Persistence API)的支持,用于存储和检索流程实例、任务和其他相关数据到关系数据库中。 8. **jbpm-bam-5.4.0.Final.jar**:业务活动监控...

    jbpm-gpd-site.zip

    【jbpm-gpd-site.zip】是一个与jbpm(JBoss Business Process Management)相关的压缩文件,...在实际开发中,开发者还需要了解如何配置jbpm服务器,设置数据源,以及如何使用工作流API来启动、监控和管理流程实例。

    jbpm-4.3-src.rar_bdf-jbpm4 src _jboss 4.3_jboss jbpm4.3_jbpm-4.3

    10. **与其他技术的集成**:jBPM能够与各种Java EE组件(如EJB、JMS、JPA)以及Spring等轻量级框架集成,提供了丰富的API和工具,方便开发者构建完整的业务流程解决方案。 综上所述,jbpm-4.3-src的源代码包为...

    jbpm-demo-master.zip_DEMO_activiti-master_jbpm-demo_mean3x7

    - jbPM和Activiti的API和概念:如流程定义、流程实例、任务管理、事件监听器等。 - 集成jbPM/Activiti与Spring、Hibernate等Java框架的方法。 - MEAN全栈开发:了解MongoDB的数据模型,Express的路由和中间件,...

    jbpm-3.1.2.zip_jbpm_jbpm 3.1.2_jbpm-3.1.2.rar_jbpm3.1.2_工作流

    - `www.pudn.com.txt`:可能是一个下载来源或说明文档,详细介绍了jBpm 3.1.2的获取途径和相关信息。 - `jbpm-3.1.2`:这可能是一个解压后的目录,其中可能包括了jBpm 3.1.2的源代码、库文件、文档、示例和其他资源...

    jbpm-kie-services-6.1.0.Beta4.zip

    【voms-api-java.zip】描述的是VO(Virtual Organization)Management System(VOMS)的Java API,这是一个用于验证和请求VOMS属性证书的工具。VOMS是高能物理领域常用的一种身份管理和认证系统,它扩展了X.509证书...

    jbpm-designer工作流

    lib目录包含了jbpm-designer运行所需的库文件,包括jbpm核心库、Java EE相关库、图形处理库以及第三方服务的API等。这些库文件确保了jbpm-designer能够正确解析和执行工作流定义,同时也支持与其他系统和服务的集成...

    JBPM -3.1.2 相关WEb 开发JAR

    在实际开发中,通常会将这些JAR文件添加到项目的类路径中,以便能够使用JBPM提供的API来设计、部署和执行流程。例如,可以使用流程定义语言(如BPMN)来创建流程模型,然后通过JBPM的API将其部署到工作流引擎。在Web...

Global site tag (gtag.js) - Google Analytics