出自:http://blog.csdn.net/rosen/archive/2005/04/10/342134.aspx
OSWorkflow 包用途分析及代碼片斷
com.opensymphony.workflow
該包為整個 OSWorkflow 引擎提供核心介面。例如 com.opensymphony.workflow.Workflow 介面,可以說,實際開發中的大部分工作都是圍繞該介面展開的,該介面有 BasicWorkflow、EJBWorkflow、OfbizWorkflow 三個實作類別。
com.opensymphony.workflow.basic
該包有兩個類,BasicWorkflow 與 BasicWorkflowContext。BasicWorkflow 不支援事務,儘管依賴持久實現,事務也不能包裹它。BasicWorkflowContext 在實際開發中很少使用。
public void setWorkflow(int userId) { Workflow workflow = new BasicWorkflow(Integer.toString(userId)); } |
com.opensymphony.workflow.config
該包有一個介面和兩個該介面的實作類別。在 OSWorkflow 2.7 以前,狀態由多個地方的靜態欄位維護,這種方式很方便,但是有很多缺陷和約束。最主要的缺點是無法通過不同配置運行多個 OSWorkflow 執行個體。實作類別 DefaultConfiguration 用於一般的設定檔載入。而 SpringConfiguration 則是讓 Spring 容器管理配置資訊。
public void setConfiguration(SpringConfiguration configuration) { SpringConfiguration configuration = configuration; workflow.setConfiguration(configuration); } |
com.opensymphony.workflow.ejb
該包有兩個介面 WorkflowHome 和 WorkflowRemote。該包的若干類中,最重要的是 EJBWorkflow,該類和 BasicWorkflow 的作用一樣,是 OSWorkflow 的核心,並利用 EJB 容器管理事務,也作為工作流程 session bean 的封裝器。
com.opensymphony.workflow.loader
該包有若干類,用得最多的是 XxxxDescriptor,如果在工作流程引擎運行時需要瞭解指定的動作、步驟的狀態、名字,等資訊時,這些描述符會起到很大作用。
public String findNameByStepId(int stepId,String wfName) { WorkflowDescriptor wd = workflow.getWorkflowDescriptor(wfName); StepDescriptor stepDes = wd.getStep(stepId); return stepDes.getName(); } |
com.opensymphony.workflow.ofbiz
OfbizWorkflow 和 BasicWorkflow 在很多方面非常相似,除了需要調用 ofbiz 的 TransactionUtil 來封裝事務。
com.opensymphony.workflow.query
該包主要為查詢而設計,但不是所有的工作流程儲存都支援查詢。通常,Hibernate 和 JDBC 都支援,而記憶體工作流程儲存不支援。值得注意的是 Hibernate 儲存不支援混合型查詢(例如,一個查詢同時包含了 history step 上下文和 current step 上下文)。執行一個查詢,需要建立 WorkflowExpressionQuery 執行個體,接著調用 Workflow 對象的 query 方法來得到最終查詢結果。
public List queryDepAdmin(int userId,int type) { int[] arr = getSubPerson(userId,type); //構造運算式 Expression[] expressions = new Expression[1 + arr.length]; Expression expStatus = new FieldExpression(FieldExpression.STATUS, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, "Queued"); expressions[0] = expStatus; for (int i = 0; i < arr.length; i++) { Expression expOwner = new FieldExpression(FieldExpression.OWNER, FieldExpression.CURRENT_STEPS, FieldExpression.EQUALS, Integer.toString(arr[i])); expressions[i + 1] = expOwner; } //查詢未完成流編號 List wfIdList = null; try { WorkflowExpressionQuery query = new WorkflowExpressionQuery( new NestedExpression(expressions, NestedExpression.AND)); wfIdList = workflow.query(query); } catch (Exception e) { e.printStackTrace(); } |
com.opensymphony.workflow.soap
OSWorkflow 通過 SOAP 來支援遠端調用。這種調用藉助 WebMethods 實現。
com.opensymphony.workflow.spi
該包可以說是 OSWorkflow 與持久層打交道的途徑,如當前工作流程的實體,其中包括:EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler。
HibernateWorkflowEntry hwfe = (HibernateWorkflowEntry) getHibernateTemplate() .find("from HibernateWorkflowEntry where Id=" + wfIdList.get(i)).get(0); |
com.opensymphony.workflow.util
該包是 OSWorkflow 的工具包,包括了對 BeanShell、BSF、EJB Local、EJB Remote、JNDI 的支援。