SEAM框架之我見--Business Process Management

 

一、 概念
相對PageFlow(頁面流)由同一用戶與系統之間的一系列交互完成一項任務不同,Business Process Management(工作流)的範圍更寬,它包含一系列相關任務,這些任務一般由不同人在不同時間完成。
Seam對jbpm的集成的方便性我認爲表現在三個方面:
1. 提供內置對象顯示任務列表給用戶;
2. 前文曾提到seam除新增conversation上下文外,還新增了business_ process上下文,這就是爲工作流管理提供的,應用程序可以將流程中涉及的相關狀態作爲jbpm變量存儲於business process上下文,然後seam可以持久化這些jbpm變量;
3. 提供方便的標籤開始一個流程,開始一個任務、結束一個任務。
二、 用法
下面我還是用一個示例講述工作流的用法,這個示例是一個客戶訂單審批的例子:客戶在網上提交一個訂單後,開始訂單審批流程;經理查看任務列表,接收訂單,查看訂單明細信息,根據情況批准或不批准此訂單。
1. 流程定義
流程圖:
    (見附件)
Jpdl文件:

    (見附件) <process-definition name="訂單管理"></process-definition>

2. 初始化actor ids
Jbpm對流程中用戶的管理是通過actor id和group actor ids.爲此seam內置了一個部件Actor來方便指定當前的actor ids.這個工作一般在用戶登陸時完成。
@In(create=true) Actor actor

Public String login(){
  …
  Actor.setId(user.getUserName());
  Actor.getGroupActorIds().addAll(user.getGroupNames());
  …
}
3. 啓動一個工作流
@out(scope=ScopeType.BUSINESS_PROCESS,required=false)
Long orderId;
@Out(scope=ScopeType.BUSINESS_PROCESS,required=false)
Float amount;
@Out(value=”customer”,scope=ScopeType.BUSINESS_PROCESS,required=false)
String customerName;

  @CreateProcess(definition="OrderManagement")
      public void submitOrder() {
        try {
            completedOrder = purchase(customer, currentOrder);

            orderId      = completedOrder.getOrderId();
            amount       = completedOrder.getNetAmount();
            customerName = completedOrder.getCustomer().getUserName();
        } catch (InsufficientQuantityException e) {
           …       
        } catch (Throwable t) {
            …
        }
      }    
4. 任務分配
當開始一個工作流的時候,任務實例被創建,任務實例必須分配給一個用戶或用戶組,相應seam中分配任務有二種方式—分配給用戶或用戶組,如:
分配給用戶:
<task description="ship order" name="ship"></task>(見附件)
          <assignment actor-id="#{ shipperAssignment.actorId}"></assignment>                    
  
分配給用戶組:
<task description="Ship order" name="ship"></task>(見附件)
           <assignment pooled-actors="#{shipperAssignment.pooledActors}"></assignment>

5. 任務列表
有兩個內置的seam部件方便顯示任務列表—一個是顯示分配給組用戶的任務,一個是顯示分配給當前用戶的指定類型的任務。
顯示分配給當前用戶的指定類型的任務示例如下:
<h:datatable var="task" value="#{taskInstanceListForType['ship']}">
            (見附件)<h:column>               </h:column>              
</h:datatable>
顯示分配給當前用戶所屬組的任務示例如下:
<h:datatable var="task" value="#{pooledTaskInstanceList}">(見附件)<h:column>            </h:column>
            <h:column>
                  <s:link value="Assign" action="#{pooledTask.assignToCurrentActor}" taskinstance="#{task}" linkstyle="button">
             </h:column>
</h:datatable>

6. 開始任務
Seam提供了兩個標註開始任務:@StartTask和@BeginTask.開始任務時開始一個conversation上下文,能在其中訪問保存在business process上下文中的變量。
@BeginTask
      public String viewTask() {
    order = (Order) em.createQuery("select o from Order o join fetch o.orderLines where o.orderId = :orderId")
            .setParameter("orderId", orderId)
            .getSingleResult();
          return "accept";
}
7. 結束任務
Seam提供@EndTask標註結束任務,並指明下一步流程。如:
@EndTask(transition="approve")
      public String accept() {
          order.process();
          return "admin";
 }
8. 系統配置
和配置pageflow類似,seam在component.xml文件中配置JBPM.
<component class="org.jboss.seam.core.Jbpm">(見附件)  </component>

 

發佈了88 篇原創文章 · 獲贊 0 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章