今天湯老師講了比較典型的jbpm流程,並在jbpm外掛程式上對它進行實現。來鞏固前面所學的jbpm,有助於更熟練的使用和掌握jbpm,湯老師主要講了詢價採購的流程。
詢價採購是指對幾個供貨商(通常至少三家)的**進行比較以確保**具有競爭性的一種採購方式。
採購詢價工作流程,以**採購為例。
一、詢價準備
1 、計畫整理。採購**機構根據**採購執行計畫,結合採購員的急需程度和採購物品的規模,編制月度詢價採購計畫。
2 、組織詢價小組。詢價小組由採購人的代表和有關專家共三人以上單數組成,其中專家人數不得少於成員總數的三分之二,以隨機方式確定。詢價小組名單在成交結果確定前應當保密。
3 、編制詢價檔案。詢價小組根據**採購有關法規和專案特殊要求,在採購執行計畫要求的採購時限內擬定具體採購專案的採購方案、編制詢價檔案。
4 、詢價檔案確認。詢價檔案在定稿前需經採購人確認。
5 、收集資訊。根據採購物品或服務等特點,通過查閱**商資訊庫和市場調查等途徑進一步了解**資訊和其他市場動態。
6 、確定被詢價的**商名單。詢價小組通過隨機方式從符合相應資格條件的**商名單中確定不少於三家的**商,並向其發出詢價通知書讓其**。
二、詢價
1 、詢價時間告知市招標辦、資金管理部門等有關部門。
2 、遞交**函。被詢價**商在詢價檔案限定的時限內遞交**函,工作人員應對**商的**函的密封情況進行審查。
3 、詢價準備會。在詢價之前召集詢價小組召開詢價預備會,確定詢價組長,宣布詢價步驟,強調詢價工作紀律,介紹總體目標、工作安排、分工、詢價檔案、確定成交**商的方法和標準。
4 、詢價。詢價小組所有成員集中開啟**商的**函,作**記錄並簽名確認,根據符合採購需求、質量和服務相等且**最低的原則,按照詢價檔案所列的確定成交**商的方法和標準,確定一至二名成交候選人並排列順序。
5 、詢價報告。詢價小組必須寫出完整的詢價報告,經所有詢價小組成員及監督員簽字後,方為有效。
三、確定成交人
1 、採購人根據詢價小組的書面談判報告和推薦的成交候選人的排列順序確定成交人。當確定的成交人放棄成交、因不可抗力提出不能履行合同,採購人可以依序確定其他候選人為成交人。採購人也可以授權詢價小組直接確定成交人。
2 、成交通知。成交人確定後,由採購人向成交人發出《成交通知書》,同時將成交結果通知所有未成交的**商。
3 、編寫採購報告。詢價小組應於詢價活動結束後在規定時間內,就詢價小組組成、採購過程、採購結果等有關情況,編寫採購報告
通過這個流程的學習,也鞏固了前面所學的知識,這個流程中重要的部分就是對定時器的應用。
timer
定時器,指定到期時間和動作,在到期後指行相應的動作。配置定時器是使用timer元素,在timer中可以使用(乙個)action或script子元素指定乙個動作,這個動作在定時器觸發後被執行。執行timer的任務需要乙個timer runner(任務執行者)。他的作用是定期的(預設為5秒鐘)檢查資料庫中的jbpm_job表,檢視有沒有已到期的job,如果有,就執行之,並刪除已執行完的job。 create timer就是向jbpm_job中新增乙個job。timer可以在node(節點)中或task(任務)中定義。如果在節點中定義,定時器就會在進入節點的時候被啟動,在離開節點的時候被取消; 如果是在任務中定義,定時器就會在建立任務的時候被啟動,在完成任務的時候被取消。
任務執行者的啟動方式分別為:
1> 在程式中使用:jbpmconfiguration.startjobexecutor();
2> 在web專案中的web.xml中配置jobexecutorservlet這個servlet,
並設定隨系統啟動而初始化,如下:
jobexecutorservlet
org.jbpm.job.executor.jobexecutorservlet
1timer有以下可以配置的屬性:
duedate :多長時間之後觸發,觸發後將會執行指定的動作;
repeat :觸發後多長時間重複執行一次指定的動作;
transition :如果設定了,在定時器觸發後就會使用他離開節點;
為duedate和repeat的指定時間的語法是:[business]
每個timer要有乙個唯一的名字。如果沒有給定時器元素指定名字,將會使用
timer所在的元素的名字作為定時器的名字。
定義timer要注意兩點:
1> 如果指定了動作,又指定了transition,則動作會在離開節點之前被執行;
2> 如果指定了transition又指定了repeat,則repeat是沒有意義的,因為離開節
點後timer就被取消了;
定義了timer,卻沒有執行相應的動作,則可能是以下原因造成的:
a) 沒有啟動jobexecutor;
b) 離開了timer所在的節點(比如在tasknode中做完了所有任務);
c) timer所在的任務例項已結完成了;
任務分配
任務分派有兩種模式,分別是推(push)模式和拉(pull)模式。
a) 推模式(個人任務):是在任務分派的時候,直接將任務例項分派給乙個指定的使用者,任務例項進入這個使用者的個人任務列表中。
分配任務的方式:
1> 在流程定義中定義任務時,用actor-id指定(乙個固定值或表示式);
2> 在程式**中使用taskinstance.setactorid(string)指定;
3> 使用assignmenthandler,方法為assignable.setactorid(string);
查詢個人任務列表的方法為:
taskmgmtsession.findtaskinstances(string actorid);
b) 拉模式(組任務):是將任務例項分派給一組使用者,這個任務例項會出現在(這個組中使用者的)組任務列表中。執行組任務時,需要首先將任務例項拉到自己的個人任務列表中,然後執行此任務。當有乙個組任務被某個組使用者取出後,該任務例項就會從組任務列表中移除。(任務競爭的機制)
分配任務的方式:
1> 在流程定義中定義任務時,用pooled-actors指定(多個參與者用逗號隔開);
2> 在程式**中使用taskinstance.setpooledactors(string)指定;
3> 使用assignmenthandler,方法為assignable.setpooledactors(string);
查詢組任務列表的方法為:
taskmgmtsession.findpooledtaskinstances(string actorid);
對於乙個組任務,如果他的actorid為null,組中所有的使用者都可以在組任務列表
中看到這個任務。如果使用taskinstance.setactorid(string)方法設定這個任務
由指定的acrorid來辦理,這時pooledactors中的其他人就看不到這個任務了,就
是說actorid會遮蔽pooledactors; 當這個使用者因某些原因不能辦理任務時,應
該把這個任務再退回到組任務列表中,方法是呼叫taskinstance.setactorid()設
置actorid為null,這時pooledactors中的所有人又都可以看到這個任務了。
這兩種分配任務的模式都可以使用任務分派介面assignmenthandler來實現。任務在定義的時候指定對應的assignmenthandler介面實現類。引擎在建立任務例項的時候會呼叫介面中的assign方法。其實現應該呼叫引數assignable的方法對任務進行分派。
傳智播客學習有感
來傳智播客學習幾個月了,學習的很差,為什麼呢,我曾經這麼回答過,如果乙個人曾經很輕鬆的賺過錢,然後某天他改行做程式設計了,那麼是一件很折磨人的事情,寫 絕對不是一件輕鬆的事情,很容易疲倦,也很容易煩躁不安,我在傳智播客學習了幾個月說真的學的很差,動手太差,只侷限於聽,導致的結果是做乙個簡單的html...
傳智播客mysql分頁的實現 傳智播客 分頁
整理了一宿,終於找到了頭緒,在頭腦還算清醒時,整理下分頁的筆記.我這個分頁用的是oracle的資料庫.他在查詢時涉及到了乙個偽列.table名為 employees.建立bean物件employee.屬性如下 private int employee id private string first ...
傳智播客學習筆記4 24
傳智播客學習筆記4.24 檢視中沒有資料 檢視中查詢語句儲存於資料字典中 如果通過檢視訪問資料,至少訪問系統兩次 實際工作時,需要站在使用者的角度去考慮 盡量不要對檢視進行dml操作 在檢視定義中,可以使用with read only選項來保證該檢視上不能進行dml操作 閃回技術 oracle 10...