JBPM笔记

来源:互联网 发布:搜索阿里云免费开通码 编辑:程序博客网 时间:2024/05/16 04:32

JBPM3.2.3安装

1、下载地址 http://sourceforge.net/projects/jbpm/files/jBPM%203/




下载jbpm-jpdl-suite-3.2.3.zip。

2、win7系统下进入 C:\Users\Administrator\AppData\Local\Genuitec\MyEclipse-8.6目录。(目录是安装myeclipse目录每个人的目录都可能不同)

进入dropins目录,建立jbpm3.2.3.link文件。内容如下:

path=C:\\Users\\Administrator\\AppData\\Local\\Genuitec\\MyEclipse-8.6\\MyPlugins\\Jbpm3.2.3

在myelcipse目录内新建MyPlugins目录

其中新建Jbpm3.2.3目录。


3、Eclipse启动完成后,点击Window—Preferences—RuntimeLocations节点

新增

Name=jBPM3.2.3

     Location=path=D:/jbpm-jpdl-suite-3.2.3/jbpm-jpdl-3.2.3



JBPM总共12种类型节点


Start  开始节点   End结束节点   

State等待节点  Fork拆分节点 Join聚合节点 

Decision 判断流程流转路线

Node自动任务节点 Task node任务节点 Mail node Email节点  

ESB Service 调用Service 节点

Process state 子流程节点   

Super state 超状态节点


start节点也可以加入任务


<start-state name="start">

<task>

<assignment actor-id="#{userId}"/>

</task>

<transition name="" to="task1"/>

</start>


1、Node节点

如果node节点上没有定义的Action,那么流程执行到此节点不会停留。若定义了Action那么流程执行完Action之后会停留在node节点上。当发出singal指令时,流程才会继续向下流转。


node节点事件:node-enter(进入节点触发)、node-leave(离开节点触发),



2、State节点

流程执行到State节点会停留下来。直到外部向其发送向下流转的命令才会向下流转。
\


3、tasknode节点

一个任务实例的生命周期可以分为三个阶段:create,start,end.
一个任务触发的事件有四个
1.task-Create
2.task-assign  
3.task-start
4.task-end

<task-node name="task1">

<event type="task-create">

<script>

print(出发了task-create事件);

</script>

</event>

<transition to="end"/>

</task>

-------------------



<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="testTaskNode02">
  
   <start-state name="start">
      <transition name="" to="task1"></transition>
   </start-state>
   <task-node name="task1">
      <event type="task-create">
        <script>
          print(&quot;触发了task-create事件&quot;);
        </script>
      </event>
      <event type="task-start">
        <script>
          print(&quot;触发了task-start事件&quot;);
        </script>
      </event>
      <event type="task-assign">
        <script>
          print(&quot;触发了task-assign事件&quot;);
        </script>
      </event>
      <event type="task-end">
        <script>
          print(&quot;触发了task-end事件&quot;);
        </script>
      </event>
      <task>
         <assignment actor-id="bf015"></assignment>
      </task>
      <transition name="" to="end1"></transition>
   </task-node>
   
   <end-state name="end1"></end-state>
</process-definition>




jbpmConfiguration对象的实例化


1、jbpmConfiguration是一个单列对象,在我们的应用系统里可以只有一个实例化的jbpmConfiguration对象

2、使用此对象是可以通过jbpmConfiguration对象提供的静态方法getInstance()来返回它

3、JbpmConfiguration  jbpmConfiguration = JbpmConfiguration.getInstance();

4、jbpmConfiguration对象的最大作用就是用来创建一个jbpmContext对象

5、jbpmConfiguration对象是线程安全的



jbpmConfiguration对象的常用方法

1、Public    static    JbpmConfigurationgetInstance()

      静态方法,返回一个JbpmConfiguration对象

2、Public   JbpmContext      createJbpmContext()

      创建一个新的jbpmContext对象

3、Public   JbpmContext      getCurrentJbpmContext()

      从当前线程的局部变量ThreadLocal里获取一个JbpmContext对象

4、Public   void  createSchema()

      创建JBPM数据库表

5、Public   void  dropSchema()

      删除JBPM数据库表

6、Public  JobExecutor   getJobExecutor()

      得到系统里的任务调度服务对象

7、Public  void   startJobExcutor()

      开始系统的任务调度服务


JbpmContext对象的常用方法


1、public   void  deployProcessDefinition(ProcessDefinition processDefinition)

      将给定的流程模版发布到数据库中

2、public   java.sql.Connection getConnection()

      返回一个JDBC的Connection

3、public   java.util.List  getTaskList(java.lang.String.actorId)

      返回给定的任务参与者的待办任务列表

4、public   TaskInstance  getTaskInstance(longtaskInstanceId)

      根据任务实例的ID得到对应的任务实例对象

5、public   ProcessInstance  newProcessInstance(java.lang.String  processDefinitionName)

      根据给出的流程模版的名称创建一个新的流程实例

6、public   ProcessInstance  loadProcessInstance(long  processDefinitionId)

      根据给出的流程实例ID加载对应的流程实例对象

7、public   org.hibernate.Session.getSession()

      返回一个HibernateSession对象


发布流程
jbpmContext.deployProcessDefinition(流程模版对象)
加载流程实例
ProcessInstance     pi = jbpmContext.loadProcessInstance(流程实例ID)
加载任务实例
TaskInstance     ti = jbpmContext.loadTaskInstance(任务实例ID)
加载待办任务
List  taskList  =  jbpmContext.getTaskList(参与者名字)



JBPM的版本机制允许在数据库中多个同名流程模版共存。

第一个版本它的版本version值就是1,第二个版本它的版本version值就是2

此版本信息在jbpm_processdefinition此表中存储

ProcessDefinitionpd =

    jbpmContext.getGraphSession().findLatestProcessDefinition(“helloworld”)


当一个流程实例创建出来的时候,一个Token(根令牌)也就被创建了,此时的Token自然就指向开始节点Start节点上。

Token  token = processInstance.getRootToken()

用来获取流程启动后产生的Token

Token.signal()让流程实例向下流转

Token从开始节点离开时,这时就触发了这个节点的

node  leave”事件

Token到达节点A时,这时就触发了这个节点的

node  enter”事件



AssignmentHandler

DescisionHandler


sWimlane

用于处理一个流程中多个任务节点由同一个人或者角色来完成。实际开发用的不多


<swimlane name="user">

<assignment actor-id="#{userId}"/>

</swimlane>

<task-node name="task1">

<task swimlane="user"/>

<transition to="end"/>

</task>



Pooled Actor

可以为一个任务直接分配多个参与者,多个参与者,号分开。

这种方式是静态的,不能动态分配。

例如提交给一个部门,可能该部门的人都能看到,处理一次就行了。

<task-node name="task1">

<task>

<assignment pooled-actors=""/>

<task/>

<transition to="end"/>

</task>



任务调度,发送邮件

james-2.3.1邮件服务

dos目录下执行bin目录下的run.bat启动邮件服务器

进入dos命令行。telnet localhost 4555

用户民密码都是root

添加用户: adduser user1  123456

<task-node name="task1">

<task notify="true">//邮件调用

<assignment actor-id="#{userId}"/>

</task>

<transition to="end"/>

</task>


-----------------------


<state name="等待节点1">

<timer duedate="5 seconds" name="test timer">//五秒钟自动执行脚本

<script>

print(&quot;hello&quot;);

</script>

</timer>
<transition to="自动节点"></transition>
</state>


duedate

repeat

tranistion


<state name="等待节点1">

<timer duedate="5 seconds" name="test timer" repeat="10 seconds">//五秒钟自动执行脚本,10秒钟重复循环执行

<script>

print(&quot;hello&quot;);

</script>

</timer>
<transition to="自动节点"></transition>
</state>





-------------------------

异步


<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="testasync">
   <start-state name="start">
      <transition name="" to="node1"></transition>
   </start-state>
   
   <node name="node1" async="true">
      <action name="thread wait action" class="com.bf.ThreadWaitAction"></action>
      <transition name="" to="node2"></transition>
   </node>
   
   <node name="node2">
      <event type="node-enter">
         <script>
           print(&quot;enter node 2....&quot;);
         </script>
      </event>
      <transition name="" to="end1"></transition>
   </node>
   <end-state name="end1"></end-state>
</process-definition>


同步


<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="testTb">
   <start-state name="start">
      <transition name="" to="node1"></transition>
   </start-state>
   
   <node name="node1" >
      <action name="thread wait action" class="com.bf.ThreadWaitAction"></action>
      <transition name="" to="node2"></transition>
   </node>
   
   <node name="node2">
      <event type="node-enter">
         <script>
           print(&quot;enter node 2....&quot;);
         </script>
      </event>
      <transition name="" to="end1"></transition>
   </node>
   <end-state name="end1"></end-state>
</process-definition>



----------------------


<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="testjob">
   <start-state name="start">
      <transition name="" to="state1"></transition>
   </start-state>
   <state name="state1">
      <timer duedate="5 seconds" name="test timer" repeat="10 seconds">
        <script>
          print(&quot;hello  &quot;);
        </script>
      </timer>
      <transition name="" to="end1"></transition>
   </state>
   <end-state name="end1"></end-state>
</process-definition>


--------------------


会签--比较重要

<process-definition
  xmlns="urn:jbpm.org:jpdl-3.2"  name="testcountersign">
   <start-state name="start">
      <transition to="会签任务节点"></transition>
   </start-state>
   <task-node name="会签任务节点">
      <task name="会签任务"> </task>
      
        <event type="node-enter">
           <action class="com.bf.CountersignAction"></action>
        </event>
     
      <transition name="" to="end1"></transition>
   </task-node>
   <end-state name="end1"></end-state>
</process-definition>




//设置参与者
public class CountersignAction implements ActionHandler {
public void execute(ExecutionContext executeContext) throws Exception {
System.out.println("aaaaa");
Token token =  executeContext.getToken();
TaskMgmtInstance tmi = executeContext.getTaskMgmtInstance();
TaskNode taskNode = (TaskNode)executeContext.getNode();
Task task = taskNode.getTask("会签任务");
//从流程上下文里获取会签人列表
List<String> ls = (List<String>)executeContext.getVariable("actorList");
for(String actorId : ls) {
          TaskInstance ti = tmi.createTaskInstance(task, token);
          ti.setActorId(actorId);
}
}
}

原创粉丝点击