今天是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
:真实的目录