今天是jBPM的第二天,內容不多,定義不少,主要講了流程變量,節點和事件等知識,全是新的知識,剛學肯定生疏,久了就沒問題了,編程嘛,多敲代碼,多
調試,才是王道。
1. 流程變量
通過org.jbpm.context.exe.ContextInstance來操
作變量。
2.變量的生命周期
變量的訪問和賦值是在某一個token上進行的,缺省時,是基于root
Token。每個Token(執行路線)有它自己的一套流程變量。變量的作用域和所屬的Token的生命周期一致,不同的Token上的同名變量互不影
響。
3.變量值要求
變量名的類型為java.lang.String,支持的變量值類型如下(文檔10.1節)。(
如
果變量值是classes that are persistable with
hibernate,則POJO的id應為long型或String型。
saveOrUpdate( po );
savePoIdAndPoClassAsVariable()
session.get(
class, id )
節點
1.
流程圖中的各種節點的作用及用法
為什么需要多種節點類型?
需要有不同類型(作用)的節點,才能設計出復雜的流程圖。
Jbpm有一套預先定義好的節點類型。如果不夠用,也可以使用自定義節點進行擴展,以完成不同的流程的需要。
不同的節點類型代表不同的行
為。
每個流程都必須要有開始節點和結束節點。
2.預定義節點
start-state,開始節點:標識流
程開始、
end-state,結束節點:標識流程結束、
task-node,任務節點:可以放0個或多個任務、
decision,
決策節點:路徑選擇,只使用一個流轉(叉路口)、
fork/join,分支節點/合并節點:可以分為多個并行執行的分支、
state,狀
態節點:等待。
每個節點都對應一個類(Jbpm的持久化類),都是org.jbpm.graph.def.Node的子類。節點
都有名字、流轉(end-state除外)。
event事件
事
件。
1, 有幾種事件,分別在什么時候觸發
2, 怎么指定當事件觸發時做什么事(Action)
1, 節點的事件
a)
進入節點(node-enter)。(開始節點沒有)
b) 離開節點(node-leave)。(結束節點沒有)
2,
流轉的事件
a) 只有一個:使用流轉(take a transition)
3, 任務的事件
a)
創建任務(task-create)
b) 分配任務(task-assign)
c)
開始任務(task-start)à TaskInstance.start()
d) 結束任務(task-end)à
TaskInstance.end()
每個事件有一個動作(action)清單。當jBPM引擎產生一個事件,動作(action)清單就會被
執行. 不同的節點支持的事件類型不同,是由event元素所在的節點的類型決定的,例如transition只有一個事件。
可以在event元
素用可以指定一個動作,當指定的事件發生時,這個動作被執行。
可以給同一個事件指定多個動作,當這個事件觸發的時候,這些動作執行的順序
和定義先后順序是一致的。
不同元素支持不同的事件類型:
一般的節點都具有的事件:node-enter,進入節點、
node-leave,離開節點;
start-state只有node-leave;
end-state只有node-enter;
transition
只有一個執行轉換的事件(taking a transition)。因為只有一個事件,所以配置時不用寫event元素,而直接配置Action。
task
有task-create,任務創建、task-assign,任務分配、task-start,任務開始、task-end,任務結束。
關
于哪些元素支持哪些事件,可以通過文檔的18.4節中的xml文件的寫法中獲得。
如果配置的事件類型不存在,不會報錯,也不會執行。
注
意:在事件中定義的動作(Action)不應該(不能)影響流程的執行。即不要在事件的動作中給token發信號,否則會拋異常:token is
locked。(在Node中配置的Action可以給Token發信號。)
事件執行的順序:
已觸發事件:node-leave
已觸發事件:transition
已
觸發事件:node-enter
已觸發事件:task-create
已觸發事件:task-assign
已
觸發事件:task-start
已觸發事件:task-end
*************************
動態的創建不確定數量的任務實例 *********
會簽。
實現任務分配給多個人,在流程定義中定義的相
應的任務,不指定參與者,也不知道指定為誰。需要做以下工作:
1,
阻止jBPM自動創建任務實例(設置task-node的create-tasks="false")
2,
在node-enter事件中定義一個動作指定用于創建TaskInstance的類。
類
CreateTaskInstancesAction要接管兩個操作:創建與分配任務實例。
創建任務實例要調用方法:
TaskMgmtInstance.createTaskInstance(Task, ExecutionContext);
其中的
Task 是任務的定義,可以先得到當前的節點:
TaskNode taskNode = (TaskNode)
executionContext.getNode();
然后通過任務的名字得到任務的定義:
Task task =
taskNode.getTask("審批");
任務分配
個人任務:actor-id=”xxx”
查詢組任務列表的方法為:
TaskMgmtSession.findPooledTaskInstances(String
actorId)
對于一個組任務,如果他的actorId為null,組中所
有的用戶都可以在組任務列表中看到這個任務。如果使用TaskInstance.setActorId(String)方法設置這個任務由指定的
acrorId來辦理,這時pooledActors中的其他人就看不到這個任務了,就是說actorId會屏蔽pooledActors;
當這個用戶因某些原因不能辦理任務時,可以把這個任務再退回到組任務列表中,方法是調用TaskInstance.setActorId(null)設置
actorId為null,這時pooledActors中的所有人又都可以看到這個任務了。
不管使用哪種方式分配任務,參與者
(Actor-id,字符串類型)的計算(確定)都是由業務層負責解釋的。
最后湯兄給我們推薦了一些好書,學習java必須準備三樣: 心態,基礎,睡覺。能學多少學多少。明天才是OA工作流項目的開始!加油。。。
posted @
2010-02-01 21:59 d66380022|
編輯 收藏
JBPM與OA
項目
哈
哈,今天終于要開始做項目了,心情特別好,在第一天中湯兄讓我們先明白了什么是工作流,怎樣很好的解決這一類問題等,接著來了個Helloworld,就入門了。每天都在學習,每天都有收獲,感覺真好。還要再提一下,OA(辦公自動化)主要技術之一就是工作流,好,還是仔細總結一下一天所學:
1. 工作流就是工
作流程的計算機化。
流程(OA),數量多,隨時更改
網購:提交訂單—>配貨—>發貨—>收貨—>付款
當我們想增加、修改流程時,而不想編程則需要用到工作流引擎,由它負責判斷下一步
做什么。下圖是它的原理:
狀態機 +if
else
2. 工作流要解決的主要問題是:為實現某個業務目
標,在多個參與者之間,利用計算機,按某種預定規則自
動傳遞文檔、信息或者任務。
通俗的說,就是多個人在一起合作完成某件事情。
接下來是jBPM介紹
3.jBPM介紹
jBPM全稱是Java
Business Process Management。是一種基于J2EE的輕量級工作流管理系統,jBPM是公開源
代碼項目。
官方主頁http://labs.jboss.com/
下載地址:http://labs.jboss.com/jbossjbpm
最重要的還是接下來的jBPM的使用
4.Jbpm的使用
server:提供的一個執行、測試工作流和平臺(Web應用程序)。
流程圖是一個有向圖,由兩部分組成:節點和流轉。節點有各種各樣形狀(代表各種各
樣的作用)。流轉就是指單箭頭,代表從一個節點到下一個節點。
此文件的約束就是 jPDL。
在jPDL中,不同
的節點,就用不同的標簽。
1.xml文件名必須為:processdefinition.xml。
2.必須要在一個zip文件的根目
錄中。
3.可以有一個名為processimage.jpg的文件,是流程圖。
應用myEclipse設
計流程圖步驟:
1.裝jbpm-jpdl-3.2.2插件:
找到jbpm-jpdl-3.2.2下的designer路
徑復制一下,注意路徑中不能有中文
2.之后在桌面上myEclipse快
捷方式,點右鍵,查找目標,找到myEclipse安裝目錄,再其下的links目錄下
加入a.link文件
(a可以隨意寫),內容為
path=粘貼
注意里路徑變為雙斜線,之后關閉myEclipse,再打開就OK了。
3.在myEclipse下新建介紹java工程,在src下,新建Process
Definition點下一步,為Process
name :起個名,比如HelloWorld
。。。。
4,啟動服務器:server/start.bat
5,訪問:http://localhost:8080/jbpm-console,登陸后,點Deploy,下圖:

6.將zip文件部署
7.點Deploy
8.點start
9.點tokens
后點singal,后在其下點singal
10.點tasks,點start ,按部就班搞定
注意事項:
1.怎么從開始節點往下走?Tokens
à Signal(只點一次)
2.怎么沒有properties窗口?Window
à Show
View à
Properties
3.怎么一點Signal,就結束了呢?沒有在Task-Node中
定義任務吧。要說明任務名稱與任務的執行者。
4.點擊Process
Image,在圖片上沒有一個正在運
行的標志,而且在上方還有一個錯誤提示?把節點的名稱改為英文,重新Deploy就可
以了。
Jboss Server所在的路徑中不能有
中文或特殊
字符(如&,有的在文件夾jbpm&oa中,這樣就不行),否則不能運行
Token的解釋:流程實例通過Token的維護
當前正在執行的節點
入門程序:
HelloWorld
1, 設計流程定義à
打包為zip文件(流程
定義文檔,說明par的格式要
求)
2, 部署流程定義à
把工作流交給工
作流管理系統保存起來。只需要執行一次,一般是管理員進行操作。
3, 執行流程à
多個操作:
a)
啟動(創建)流程實例(Signal)
b)
獲取任務列表(只是自已的任務實
例列表)
c)
辦理任務
i.
開始任務
ii.
結束任務
今天就這么多了,明天再寫!
posted @
2010-01-31 23:36 d66380022|
編輯 收藏
今天繼續講的是lucene
的分詞器,湯兄先回顧了昨天的所學內容,很好。今天講了lucene
的細節,比如分詞器和高亮器,以及高級搜索等功能的實現框架Compass
,案例是傳智的貼吧搜索功能的實現,用的當然也是lucene
。
全文檢索(Lucene
)的深入
分詞器:對文本資源進行切分,將文本按規則切
分為一個個可以進行索引的最小單位(關鍵詞)。
某文檔中的一段文本,經過分詞后如下:
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
在
|
Internet
|
上
|
采集
|
信息
|
的
|
軟件
|
被
|
叫做
|
爬蟲
|
或
|
蜘蛛
|
。
|
建立索引和進行搜索時都要用到分詞器。為了保證能正確的搜索到結果,在建立索引
與進行搜索時使用的分詞器應是同一個。
全文檢索不區分大小寫
對于中文分詞,通常有三種方式:單字分詞、二分法分詞、詞典分詞。
最好的分詞器:詞庫分詞
高亮器:
1.作用:
1.截取摘要(大小)
2.高亮關鍵字(前綴
后綴)
2.怎么用:
過濾器
Filter
RangeFilter,可以對搜索出來的結果進行過
濾。
排序
sort
Lucene的搜索結果默認按相關度排序的。所謂相關度,就是文檔的得分。Lucene有一個評分機制,就是對檢索結果按某種標準進行評估,然后按分值的高低來對結果進行排序。
查詢對象
TermQuery
Term是查詢的最小單位,第一個參數是屬性,第
二個是要查詢的內容,下面的代碼的
整個意思就是在title中查詢檢索
Term term = new
Term(“title”,”檢索”);
Query query = new
TermQuery(term);
關鍵詞查詢RangeQuery
范圍查詢WildcardQueryPhraseQuery
短語查詢
BooleanQuery
public void
add(Query query, Occur occur)
Occur 用于表示布爾查詢子句關系的類,包括:
Occur.MUST,Occur.MUST_NOT,Occur.SHOULD。
1,
MUST和MUST:取得連個查詢子句的交集。
2,
MUST和MUST_NOT:包含MUST并且查詢結果中不包含MUST_NOT的檢索結果。
3,
SHOULD與SHOULD,表示“或”關系,最終檢索結果為所有檢索子句的并集。
Compass框架
Lucene +
Hibernate
Hibernate操作實現原理:
主配置文件 :hibernate.cfg.xml
1.連接信息
2.聲明映射文件
3.其他配置
映射文件:.hbm.xml
對象
– 表
屬性
– 列
同樣,Compass實現原理如圖:
posted @
2010-01-31 23:35 d66380022|
編輯 收藏
Lucene
今天由湯陽光老師(不如說是湯兄)給我們講lucene,一見湯兄,太年輕了,真是這感覺真讓我有些小慚愧,呵呵。。。還是學好技術是第一要務。
從
現在到年前都是湯兄給我們上課,今天和明天是搜索引擎,存儲數據用的是Hibernate,全文檢索的簡化框架是Compass,Lucene講1.5
天,Compass講半天。總結一天所學的.全文檢索是目前最流行的技術,由于用數據庫搜索實現的匹配度,相關度排序和搜索速度太慢,而這些都非常致命。
下面詳細回顧:
1.信息檢索:找出與用戶需求相關的信息
平時接觸的信息有文:html,doc,pdf和 txt,
多媒體:音頻,視頻,圖片...
全文檢索: 1.只關注文本。比如我搜索:中國的首都在哪里?和我搜索中國 首都
北京是一樣的,我們主要是研究出現了某些詞的文本 2.不處理語義,只是詞匹配
全文檢索的作用:1.bbs,blog,news,商城的站內搜索,資源有限
Eclipse的幫助就是用Lucene做的
2.入門
運行原理/入門概念
Hello World
需求:就像百度的搜索框一樣,輸入內容,點擊搜索,得出結果,并且要求時間非常短
后臺:點搜索后,會去信息集合(索引庫)里搜索,注:這個索引庫是按照一定的結構存儲,這個結構可以實現快速搜索
使用流程:1事先就不停再找,建立索引,2.搜索
索引庫的結構:索引庫是存到一些二進制文件,這些文件在同一個目錄下 --à索引庫目錄
Document 一條數據
Field 數據中的一個字段
Field是組成Document的元素
實現:
步驟:1.建立索引
2.搜索
都用到的是分詞器(analyzer),應使用同一種分詞器
實現HelloWorld:添加jar包
lucene-core-2.4.0.jar(核心);
contrib/analyzers/lucene-analyzers-2.4.0.jar(分詞器);
contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);
1.建立Article.java,屬性有id,title,content
2.HelloWorld.java.兩個主要方法:
1.建立索引:
createIndex()
2.搜索
search()
進行搜索
public void search() throws Exception {
String
queryString = "document";
//
1,把要搜索的文本解析為 Query
String[]
fields = { "name", "content" };
QueryParser queryParser = new
MultiFieldQueryParser(fields, analyzer);
Query query
= queryParser.parse(queryString);
//
2,進行查詢
IndexSearcher indexSearcher = new IndexSearcher(indexPath);
Filter
filter = null;
TopDocs
topDocs = indexSearcher.search(query, filter, 10000);
System.out.println("總共有【"+topDocs.totalHits+"】條匹配結果");
// 3,打印結果
for(ScoreDoc
scoreDoc : topDocs.scoreDocs){
int docSn = scoreDoc.doc; // 文檔內部編號
Document doc = indexSearcher.doc(docSn); // 根據編號取出相應的文檔
File2DocumentUtils.printDocumentInfo(doc; // 打印出文檔信息
}
}
IndexWriter:操作索引庫,增刪改
主要方法介紹:
// 構造方法:如果索引庫不存在,會自動創建。如果存在,就使用他
new IndexWriter(String/Directory indexPath, Analyzer a,
MaxFieldLength mfl)
// 構造方法:第三個參數指定是否創建一個新的索引庫。
// 1,有索引庫,create為true:會重新創建。2,沒有索引庫,create為false,會報錯。
new IndexWriter(String/Directory indexPath, Analyzer a, boolean
create, MaxFieldLe
ngth mfl)
// 添加索引
addDocument( Document doc )
// 更新
updateDocument(Term term, Document doc)
// 刪除
deleteDocument(Term term)
// 合并索引庫
addIndexesNoOptimize(Directory[])
今天學了Lucene的入門,明天學習Lucene的高級知識,以及compass框架!
// 優化索引庫
optimize()
IndexSearcher:操作索引庫,查詢
// 構造方法,索引庫不存在,就報錯
new IndexSearcher( String indexPath )
// 搜索
TopDocs search( Query query, Filter filer, int n )
// 搜索
TopDocs search( Query query, Filter filer, int n , Sort sort)
Document doc( int docSn )
Documet:Lucene所操作的對象
Field:組成Document的元素,代表一個屬性。Store、Index
new Field( String name, String value, Store
store, Index index )
Directory:索引庫(目錄)
FSDirectory
:真實的目錄