接口選擇:
osworkflow提供幾種實現com.opensymphony.workflow.Workflow。
BasicWorkflow:
不提供事務支持,你可以通過持久層來實現事務處理。
Workflow wf = new BasicWorkflow(username)
這里的username是用來關聯當前請求的用戶。
EJBWorkflow:
用ejb容器來治理事務。在ejb-jar.xml中進行配置。
Workflow wf = new EJBWorkflow()
這里沒有必要想basicworkflow和ofbizworkflow那樣給出username。因為ejb容器已經校驗過的。
Ofbizworkflow:
與basicworkflow比較相似,不同只在于需要事務支持的方法由ofbiz TransactionUtil calls來包裝。
創建新的工作流實例:
這里是以basicworkflow為例子
Workflow wf = new BasicWorkflow(username);
HashMap inputs = new HashMap();
inputs.put("docTitle", request.getParameter("title"));
wf.initialize("workflowName", 1, inputs);
執行action:
Workflow wf = new BasicWorkflow(username);
HashMap inputs = new HashMap();
inputs.put("docTitle", request.getParameter("title"));
long id = Long.parseLong(request.getParameter("workflowId"));
wf.doAction(id, 1, inputs);
查詢:
值得注重的是:并不是所有的 workflow stores支持查詢。當前的hibernate,jdbc和內存工作流存儲支持查詢。Hibernate存儲不支持mixed-type查詢(如,一個查詢使用到了歷史和當前step contexts)。為了執行一個查詢,需要構造出一個WorkflowEXPRessionQuery對象。查詢方法是在這個對象上被調用的。
簡單查詢、嵌套查詢、mixed-context查詢(不支持hibernate工作流存儲)在docs文檔的5.4部分都有。
2.7版的osworkflow提供一種配置接口。默認實現是DefaultConfiguration,通過AbstractWorkflow的setconfiguration方法來更改歷史遺留的singleton靜態模型使其不會被使用。應該避免每次都創建新的工作流實例。
Workflow workflow = new BasicWorkflow("blah");
long workflowId = workflow.initialize("someflow", 1, new HashMap());
workflow.doAction(workflowId, 2, new HashMap());
...
//in some other class, called later on
Workflow workflow = new BasicWorkflow("blah");
workflow.doAction(workflowId, 3, new HashMap());
Workflow workflow = new BasicWorkflow("blah");
Configuration config = new DefaultConfiguration();
workflow.setConfiguration(config);
long workflowId = workflow.initialize("someflow", 1, new HashMap());
workflow.doAction(workflowId, 2, new HashMap());
//keep track of Workflow object somewhere!
...
//in some other class, called later on
//look up Workflow instance that was held onto earlier
Workflow workflow = ...; //note, do NOT create a new one!
workflow.doAction(workflowId, 3, new HashMap());
實際當中還是需要到javadoc中不斷去查。
新聞熱點
疑難解答