jbpm3.1 websale实例学习(二)执行任务

来源:互联网 发布:君王之路盾牌进阶数据 编辑:程序博客网 时间:2024/05/28 09:34
 一、获取任务列表
参与者的任务列表在界面上是home.jsp负责呈现。home.jsp设置一个jsf的datatable来获取并呈现任务列表,如下:
<h:dataTable value="#{homeBean.taskInstances}" var="taskInstance" headerClass="tableheader" columnClasses="tablecell">
  <h:column >
    <f:facet name="header">
      <h:outputText value="Task Form Link" />
    </f:facet>
    <h:commandLink action="#{homeBean.selectTaskInstance}">
      <f:param name="taskInstanceId" value="#{taskInstance.id}"/>
      <h:outputText value="#{taskInstance.name}" />
    </h:commandLink>
  </h:column>
  <h:column>
    <f:facet name="header">
      <h:outputText value="Process" />
    </f:facet>
    <h:outputText value="#{taskInstance.taskMgmtInstance.taskMgmtDefinition.processDefinition.name}" />
  </h:column>
  <h:column>
    <f:facet name="header">
      <h:outputText value="Version" />
    </f:facet>
    <h:outputText value="#{taskInstance.taskMgmtInstance.taskMgmtDefinition.processDefinition.version}" />
  </h:column>
</h:dataTable>

该datatable获取后台homeBean的taskInstances属性,对应的getter方法为:
 public List getTaskInstances() {
    return taskMgmtSession.findTaskInstances(userBean.getUserName());
  }
从这个getter方法可以看出,任务列表是通过调用org.jbpm.db.TaskMgmtSession的findTaskInstances方法获取的。findTaskInstances(String actorId)方法返回所有指定参与者的任务实例(Task Instance)列表。
由datatable生成的HTML TABLE中一共是3列。第1列是选择相应任务实例的链接。该链接对应的action为homeBean的selectTaskInstance方法,同时传递一个taskInstanceId参数,参数值为任务实例的id。第2列显示流程定义的名称。第3列显示流程定义的版本。

二、获取具体任务实例
点击对应的链接,jsf调用homebean的selectTaskInstance方法获取对应这个任务的任务实例。代码如下:
  public String selectTaskInstance() {
    long taskInstanceId = JsfHelper.getId("taskInstanceId");// 从HTTP request parameter中获取任务实例的id
    TaskInstance taskInstance = taskMgmtSession.loadTaskInstance(taskInstanceId);//获取对应的TaskInstance
    taskBean.initialize(taskInstance);//初始化taskBean
    return "task";//页面跳转至task.jsp
  }
这里要注意的是,taskBean是由jsf注入到HomeBean中的,就是说taskBean是由jsf负责创建的。同样注入HomeBean的还有userBean,而且userBean是session范围。
taskBean.initialize是一个较关键的方法,该方法在前一篇“启动工作流”略有介绍。taskBean.initialize具体做如下工作:
1、获取task的变量(variableAccess),填入TaskFormParameter对象中。这些变量就是在处理任务时填入HTML FORM中的各项参数,如项目名称、数量、地址等。由于websale实现的功能较简单,所有流程管理中的相关信息均交给jBPM管理。websale的TaskFormParameter负责传递变量值。一个TaskFormParameter保存一个变量名和对应的变量值。因此,taskBean.initialize将获取的变量填入TaskFormParameter对象,并将所有TaskFormParameter对象保存在taskBean的taskFormParameters属性中(taskFormParameters是一个LIST对象)。
2、获取可用的转换。当流程停留在某个task node时,该task node可能存在大于1个的可能转换(Transition)。taskBean.initialize的第2个任务就是将这个节点的可能转换写入taskBean的availableTransitions属性中。

taskBean.initialize完成后,页面跳转到task.jsp。该页面包含一个HTML Form。task.jsp为taskFormParameters中的每一个taskFormParameter创建一个HTML Input并设置相应的值。同时为availableTransitions中每个转换创建一个HTML Button,点击相应的Button即选择流程定义中该节点的相应转换。

三、完成任务
完成任务相对简单。首先是调用taskInstance.setVariable方法设置被提交的任务变量,然后调用jbpmContext.save(taskInstance)保存任务实例。具体代码为见TaskBean的save方法。最后调用taskInstance.end(String transition_name)方法离开该节点,并再次保存任务实例,具体代码见TaskBean的saveAndClose方法。
原创粉丝点击