Jbpm的开发流E可以按如下几步q行Q流E的定义、流E的发布、流E实例的启动、流E节点的{、查看流 E节点图片。本CZ是在spring2.0?/span>hibernate3.2?/span>struts1.2下开发?/span>
如果是其它版本的框架也很Ҏ(gu)做程 序的q移?/font>
程的定义徏议?/span>jbpm提供?/span>eclipse下的插gQ图形化配置插g安装文g可以?/span>jbpm-starters-kit-3.1.4"jbpm-designer"jbpm-gpd-feature"eclipse下找刎ͼ需注意版本。用这U方 式可以把定义的流E描q的三个文g压羃?/span>zip包,l一的部|到数据库中Q方?/span>b/spȝ中显C图片当前节点信息?/span>
1? 件安?/span>
?/span>jbpm-gpd-feature文g夹复制到C:"Program Files"MyEclipse-6.0M1"eclipse"plugins下,注意自己?/span>ecplise路径?/span>
?/span>C:"Program Files"MyEclipse-6.0M1"eclipse"links文g夹下建立jbpm-gpd.link文g。内容如下:(x)path=C:""Program Files""MyEclipse-6.0M1""eclipse""plugins""jbpm-gpd-feature?/span>
q样再重新启?/span>eclipse可以用流E定义功能了(jin)?/span>
2? E的定义
?/span>eclipse环境中选择file->new->other下的jboss jbpm->process definition程定义。要在自q目文g中先指定文g要创建的文g夏V?/span>
q样?x)生三个文Ӟ?x)gpd.xml?/span>processdefinition.xml?/span>processimage.jpg?/span>
processdefinition.xml为描q流E定义文Ӟ本例为:(x)
<?xml version="1.0" encoding="UTF-8"?>
<process-definition name="文档试程">
<start-state name="开?/span>">
<transition name="提交张三审批" to="张三审批"></transition>
</start-state>
<task-node name="张三审批">
<task name="审批1">
<assignment actor-id="张三"/>
</task>
<transition name="提交李四审批" to="李四审批"></transition>
</task-node>
<task-node name="李四审批">
<task name="审批2">
<assignment actor-id="李四"/>
</task>
<transition name="提交王五审批" to="王五审批"></transition>
</task-node>
<task-node name="王五审批">
<task name="审批3">
<assignment actor-id="王五"/>
</task>
<transition name="l束程" to="l束"></transition>
</task-node>
<end-state name="l束"></end-state>
</process-definition>
processimage.jpg文g是定义流E生的囄?/span>gpd.xml文g是图形文件的座标说明。用? ?/span>b/s下显C流E流转的囄位置?/span>
本例中的gpd.xml文g
<?xml version="1.0" encoding="UTF-8"?>
<process-diagram name="文档试程" width="801" height="477">
<node name="开?/span>" x="308" y="4" width="140" height="40">
<transition name="提交张三审批">
<label x="5" y="-10"/>
</transition>
</node>
<node name="张三审批" x="310" y="90" width="140" height="40">
<transition name="提交李四审批">
<label x="5" y="-10"/>
</transition>
</node>
<node name="李四审批" x="313" y="192" width="140" height="40">
<transition name="提交王五审批">
<label x="5" y="-10"/>
</transition>
</node>
<node name="王五审批" x="308" y="307" width="140" height="40">
<transition name="l束程">
<label x="5" y="-10"/>
</transition>
</node>
<node name="l束" x="307" y="401" width="140" height="40"/>
</process-diagram>HelloWorld JSP JUnit System.out.println println JSP SWING GUI
JUnit SimpleProcessTest.java
package com.sample; import junit.framework.TestCase; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.context.exe.ContextInstance; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; public class SimpleProcessTest extends TestCase { private JbpmConfiguration config = JbpmConfiguration.getInstance(); private JbpmContext ctx = config.createJbpmContext(); // helloworld jbpm_processdefinition name processdefinition.xml name // JDBC private ProcessDefinition processDefinition = ctx.getGraphSession().findLatestProcessDefinition("helloworld"); public void testNewRequest() { long id = newRequest(); System.out.println("id=" + id); checkNewRequest(id); confirmRequest(id); checkconfirmRequest(id); ctx.close();// jbpm } /** * * * @return */ private long newRequest() { // ProcessInstance pi = processDefinition.createProcessInstance(); // ContextInstance ci = pi.getContextInstance(); // ci.setVariable("name", " ci.setVariable("day", 2); assertEquals(null, ci.getVariable("note")); // pi.signal(); return pi.getId(); } /** * * * @param id */ private void checkNewRequest(long id) { // ProcessInstance pi = ctx.loadProcessInstance(id); // ContextInstance ci = pi.getContextInstance(); // assertEquals(" assertEquals(Integer.valueOf(2), ci.getVariable("day")); assertEquals(" " , ci.getVariable("note")); // confirm assertEquals(pi.getRootToken().getNode().getName(), "confirm"); // assertFalse(pi.hasEnded()); } /** * 审批 * * @param id */ private void confirmRequest(long id) { ProcessInstance pi = ctx.loadProcessInstance(id); ContextInstance ci = pi.getContextInstance(); // ci.setVariable("note", " " ); // pi.signal(); } private void checkConfirmRequest(long id) { ProcessInstance pi = ctx.loadProcessInstance(id); ContextInstance ci = pi.getContextInstance(); // ConfirmAction signal assertEquals(" " , ci.getVariable("note")); // end assertEquals(pi.getRootToken().getNode().getName(), "end"); // assertTrue(pi.hasEnded()); } }
]]>
jBPM 需要数据库支持Q?/span> jBPM ?x)把自己的一个初始化数据存储到数据库Q同时工作流的数据也是存储到数据库中的?/span> jBPM 使用 Hibernate 来做q存储层,因此只要?/span> Hibernate 支持的数据库Q?/span> jBPM 也就支持?/span>
本文先以 MySQL ZQ然后再?/span> Oracle ZQ来谈谈 jBPM 的数据库初始化操作?/span>
注:(x)在上面的 JBoss 自带的示例中Qƈ没有讄数据库,那是因ؓ(f) jBPM 默认使用的是内存数据?/span> hsqldb ?/span>
1 、首先安?/span> MySQL ?/span>
MySQL 的安装比较简单,|上也有很多文章Q本文不再赘q。本指南所?/span> MySQL 版本?/span> MySQL 4.1 Q?/span> for windows Q。再找一?/span> MySQL 客户端,目的是方便查看数据库中的数据Q本文推荐?/span> MySQL |站上免Ҏ(gu)供的“ MySQL Query Brower ”Q当然你用其他的客户端也行,比如 MySQL-Front ?/span>
2 、徏?/span>
MySQL 中创Z个库Q库名:(x) jbpm
3 、生成徏表的 SQL 语句q徏?/span>
?/span>
jbpm-starters-kit-
D:\jbpm-starters-kit-
D:\jbpm-starters-kit-
?/span>
DOS
H下Q进?/span>
D:\jbpm-starters-kit-
ant mysql.scripts
执行成功后,?/span>
D:\jbpm-starters-kit-
先安装好 Oracle 服务器。我们公司有现存?/span> Oracle 服务器,也提供给?jin)我一个属于我自己的用户名Q一d可以Q意在我的库之下创?jin)。所以这一步就省了(jin)Q没有的自个先装好吧?/span>
讉K Oracle 推荐?#8220; PLSQL Developer ”。不q要q接 Oracle q要在本Z装上 Oracle 自己的客L(fng)E序Q里面提供了(jin) JDBC 包和一些配|。要q接服务器还得配|一下,我一般都是不?/span> GUI 而直接改 tnsnames.ora 文gQ在我的?sh)脑里此文g的目录地址是:(x) D:\oracle\ora92\network\ADMIN\tnsnames.ora Q内容如?/span> ( 两面有两个配|了(jin) ) Q?/span>
# TNSNAMES.ORA Network Configuration File: E:\oracle\ora92\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
WXXRDB_192.168.3.2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = wxxrDB)
(SERVER = DEDICATED)
)
)
WXXRDB_192.168.4.2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.4.2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = wxxrDB)
(SERVER = DEDICATED)
)
)
前面都是 Oracle 的一些知识,不会(x)?/span> Google 一下吧。最后配|好后,?/span> PLSQL Developer 输入你的用户名和密码联接?/span> Oracle Q就?/span> OK ?jin)?/span>
参考上?/span> MySQL 的步骤,基本一P(x)
Q?Q?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> ?/span> jbpm 改名?/span> jbpm.3
Q?Q?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 再执?/span> ant oracle.scripts
Q?Q?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">
?/span>
jbpm-db\build\oracle\scripts
目录?/span>
oracle.create.sql
脚本Q在
Oracle
中生?/span>
jBPM
的所有表。在“
PLSQL Developer
”中可以新Z?/span>
Command Windows
H口然后输入命o(h)Q?/span>
@D:\jbpm-starters-kit-
工作虽然还在不成熟的发展阶D,甚至q没有一个公认的规范标准。但其应用却已经在快速展开Q这说明?jng)场对工作流框架的需求是急迫而巨大的?/span>
我们公司的后台短信管理系l涉?qing)短信编发、领导层层审核等操作Q这是一个比较典型的工作系l。过L们用的工作流引擎?/span> shark Q然后在使用后发现其q于庞大Q后台数据库操作频繁而未q行优化Q直接导致的后果是前台操作~慢。于是经研究军_Q将工作引擎由 shark 换成 jBPM ?/span>
jBPM 之前是一个开源YӞ后加?/span> JBoss l织。正好我们公怹是用 JBoss 的。不q?/span> jBPM q没有绑定在 JBOSS 上, Tomcat {也可以使用它?/span>
jBPM 的正处在不断发展中,做ؓ(f)开源Y件的特点Q其设计变化往(xin)往(xin)很大。所以一些过ȝ资料可能已经不适用?jin)。于是作者根据自q使用l验Q重新整理出q䆾文档Q以备学?fn)参考?/span>
注:(x)本文使用?/span> jBPM 版本?/span> 3.1.1
所?/span> JAVA 开发第一个需要安装的Q没什么好说的。记得把pȝ变量 JAVA_HOME 设上?/span>
Ant 是?/span> jBPM 必须的一个工兗?/span> jBPM 中的很多操作都要用到 Ant ?/span>
安装Ҏ(gu)Q?/span>
Q?/span> 1 Q先下蝲Q?/span> http://archive.apache.org/dist/ant/binaries/ Q选一个如Q?/span> apache-ant-1.6.5-bin.zip ?/span>
Q?/span> 2 Q解压到 D:\ant Q当然其他目录也可以Q?/span>
Q?/span> 3 Q设|如下系l变量:(x) ANT_HOME=d:\ant ?/span>
Q?/span> 4 Q把 %ANT_HOME%\bin 加入到系l变?/span> PATH 中?/span>
Eclipse 不是开?/span> jBPM 必须的工P但它是对 jBPM 开发很有帮助的工具Q特别是 jBPM 提供?jin)一?/span> Eclipse 插g用来辅助开?/span> jBPM 。关?/span> Eclipse 的安装不赘述?jin),本文用的版本是?x) Eclipse3.2
jBPM 的下载地址Q?/span> http://www.jboss.com/products/jbpm/downloads
l JBoss jBPM ?/span> jBPM 的Y件包
l JBoss jBPM Starters Kit 是一个综合包Q它包括?/span> jBPM 软g包、开发插件、一个配|好?jin)的Z JBoss ?/span> jBPM CZ、一些数据库配置文gCZ?/span>
l JBoss jBPM Process Designer Plugin 是辅助开?/span> jBPM ?/span> Eclipse 插g?/span>
l JBoss jBPM BPEL Extension jBPM 关于 BPEL 的扩展包
本指南选择下蝲Q?/span> JBoss jBPM Starters Kit 。下载后解压?/span> D:\jbpm-starters-kit-3.1 Q目录下含有五个子目录:(x)
l jbpm jBPM 的Y件包
l jbpm-bpel 只含有一个网?/span>
l jbpm-db 各种数据?/span> hibernate 配置文gCZQ有些还包含?jin)相应?/span> jdbc 驱动E序?/span>
l jbpm-designer 辅助开?/span> jBPM ?/span> Eclipse 插gQ具体在 jbpm-gpd-feature 子目录中
l jbpm-server 一个已l配|好?jin)的Z JBoss ?/span> jBPM CZ .
前面我们说了(jin)Q在 JBoss jBPM Starters Kit ?/span> jbpm-server 目录是一个已l配|好的了(jin) jBPM CZQ那么让我们来感觉一?/span> jBPM 做出的东西吧?/span>
双击 jbpm-server 目录下的 start.bat 文gQ启?/span> JBoss 服务。这时会(x)打开一?/span> DOS H口Q启动完成后Q日志会(x)不断输出Q其中最后一句是“ 13:55:39,937 DEBUG [StaticNotifier] going to wait for (CMD_EXECUTOR, java.lang.Object@1df59bd) ”Q这表示 jBPM 在开始工作了(jin)Q它不断q行轮询?/span>
打开|页Q?/span> http://localhost:8080/jbpm/ 得到如下画面
q是一个已l用 jBPM 开发好的用户定单流E,h下单、审核、估L(fng)程。它所用的数据库是一个内|的数据库?/span>
?/span> cookie monster 用户dQ选择“ create new web sale order ”可以创徏一个定单。如下图所C,在图左边是填写的定单情况Q右边一整个定货程的示意图Q红色框表示程q行到哪一步了(jin)。填写好定单好,选择“ Save and Close Task ”Q完成定单提交?/span>
选择右上角的“ Login as another user ”以另外一个用户名 ernie d。这时可以看?/span> ernie 用户的Q务列表中多了(jin)一V?/span>
点进dQ显C如下画面。这个示例对中文的支持不好,全都昄成了(jin) unicode 码了(jin)。不这什么多Q反正知道是q么回事p?jin)。在 comment 填写意见,?/span> OK 按钮Q进入到下一步。如果选择 more info needed 按钮Q则打回l?/span> cookie monster 用户修改定单?/span>
下面的流E,q里׃再赘qC(jin)。在q个很标准的工作示例中Q我们基本可以看?/span> jBPM 的应用范围还是比较广的。而且从这个示例,我们是看不出?/span> jBPM 的,也就是说 jBPM 在后台v着作用?/span>
从这个例子,q看不出 jBPM 的优ѝ不q,如果在一个流E不定Q经帔R要变动的目中, jBPM 的好处将?x)显然出来。应?/span> jBPM 后,改变?gu)程只需改变?gu)程描述文gQ这在后面的内Ҏ(gu)到?/span>
q是一个已做好的示例,接下来我们将仉K这个实例来开发一个请假流E?/span>豆豆|?/a> 技术应用频?/a> 2009q?4?6? 【字P(x)?/a> ?/a> ?/a>?收藏本文
跟刚开始写Acegi一? q是有些担心(j)? |上差不多的博客或帖子很多了(jin), 自己Z么还写呢? 说服自己下决?j)写的理由如?
1, 别h写是别h? 只看他们写的不能解决自己的长q问?
2, 有些博客/帖子写的不够详细, 自己在照着做时,大多都不能成?
既然下决?j)要写?jin), 先列下要用的工具: JDK(6.0), Ant(1.7.1), Eclipse(3.4.0), Tomcat(6.0.18),Mysql(5.0), jBPM(版本?.1.4, 下蝲链接: http://nchc.dl.sourceforge.net/sourceforge/jbpm/jbpm-starters-kit-3.1.4.zip).
q期的一些计?
0, jBPM的一些简单介l?
2, 把自带的例子部v到Tomcat+Mysql,l合源码, 以像跟踪自写E序那样C步步跟踪那个例子的执?
3, l合跟踪自带例子?j)? 梳理jBPM骨架.
4, 重点x(chng)Hibernate的应?
从jBMP惛_什?
1, ?jin)?学习(fn)jBPM的运行机? 以提高自己工作中用jBMP的效?
3, 深入学习(fn)体会(x)jBPM所体现再来的Y件工E? 建模.
pd文章Q?/p>
jBPM(?: 也说jBPM + Tomcat + MySQL
jBPM(?:jBPM的webSale在Tomcat下怎么q上的数据库?
jBPM(十一): 从JbpmContextFilter说v
jBPM(十二): 程q行的历史和轨迹与ProcessLog
jBPM(十三): 从ObjectFactory到ObjectInfo