有了前面?/span> HelloWorld 后台程Q我们就要开始客LE序了。正如前面提到的Q本文不?/span> JSP Q而改采用 JUnit 的Ş式,输出则用 System.out.println 。D一反三Q知道在Ҏ中输入及?/span> println 输出Q在 JSP ?/span> SWING {?/span> GUI 界面q不是一样嘛?/span>
q个 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 对应?/span> jbpm_processdefinition 表的 name 字段|也即 processdefinition.xml ?/span> name
// q个值得取比较耗时Q实际项目里最好和“数据库?/span> JDBC q接”一P让它׃nQ不要频J打开关闭?/span>
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();
// 取得程的数据环?/span>
ContextInstance ci = pi.getContextInstance();
// 创徏一张请假单
ci.setVariable("name", "
ci.setVariable("day", 2);
assertEquals(null, ci.getVariable("note"));
// 请假甌l束Q{C一个流E结?/span>
pi.signal();
return pi.getId();
}
/**
* 查请假单的数?/span>
*
* @param id
*/
private void checkNewRequest(long id) {
// 从数据库提取原流E?/span>
ProcessInstance pi = ctx.loadProcessInstance(id);
// 取得程的数据环?/span>
ContextInstance ci = pi.getContextInstance();
// 创徏一张请假单
assertEquals("
assertEquals(Integer.valueOf(2), ci.getVariable("day"));
assertEquals(" 我要请假 " , ci.getVariable("note"));
// 当前是结点ؓ confirm
assertEquals(pi.getRootToken().getNode().getName(), "confirm");
// 程q没l束
assertFalse(pi.hasEnded());
}
/**
*
审批
*
* @param id
*/
private void confirmRequest(long id) {
ProcessInstance pi = ctx.loadProcessInstance(id);
ContextInstance ci = pi.getContextInstance();
// 不通过
ci.setVariable("note", " 不准请假Ql加?/span> " );
// 审批l束Q到下一个流E结?/span>
pi.signal();
}
private void checkConfirmRequest(long id) {
ProcessInstance pi = ctx.loadProcessInstance(id);
ContextInstance ci = pi.getContextInstance();
// ConfirmAction cd signal 后执行,所以覆盖了l理的审Ҏ?/span>
assertEquals(" 准假 " , ci.getVariable("note"));
// 当前是结点ؓ end
assertEquals(pi.getRootToken().getNode().getName(), "end");
// 程l束?/span>
assertTrue(pi.hasEnded());
}
}
jBPM 需要数据库支持Q?/span> jBPM 会把自己的一个初始化数据存储到数据库Q同时工作流的数据也是存储到数据库中的?/span> jBPM 使用 Hibernate 来做q存储层,因此只要?/span> Hibernate 支持的数据库Q?/span> jBPM 也就支持?/span>
本文先以 MySQL ZQ然后再?/span> Oracle ZQ来谈谈 jBPM 的数据库初始化操作?/span>
注:在上面的 JBoss 自带的示例中Qƈ没有讄数据库,那是因ؓ 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 |站上免Ҏ供的?/span> MySQL Query Brower ”,当然你用其他的客L也行Q比?/span> MySQL-Front ?/span>
2 、徏?/span>
MySQL 中创Z个库Q库名: 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 服务器,也提供给了我一个属于我自己的用户名Q一d可以Q意在我的库之下创了。所以这一步就省了Q没有的自个先装好吧?/span>
讉K Oracle 推荐用?/span> PLSQL Developer ”。不q要q接 Oracle q要在本Z装上 Oracle 自己的客LE序Q里面提供了 JDBC 包和一些配|。要q接服务器还得配|一下,我一般都是不?/span> GUI 而直接改 tnsnames.ora 文gQ在我的电脑里此文g的目录地址是: D:\oracle\ora92\network\ADMIN\tnsnames.ora Q内容如?/span> ( 两面有两个配|了 ) 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 的一些知识,不会?/span> Google 一下吧。最后配|好后,?/span> PLSQL Developer 输入你的用户名和密码联接?/span> Oracle Q就?/span> OK 了?/span>
参考上?/span> MySQL 的步骤,基本一P
Q?Q?span style="FONT: 7pt 'Times New Roman'"> ?/span> jbpm 改名?/span> jbpm.3
Q?Q?span style="FONT: 7pt 'Times New Roman'"> 再执?/span> ant oracle.scripts
Q?Q?span style="FONT: 7pt 'Times New Roman'">
?/span>
jbpm-db\build\oracle\scripts
目录?/span>
oracle.create.sql
脚本Q在
Oracle
中生?/span>
jBPM
的所有表。在?/span>
PLSQL Developer
”中可以新徏一?/span>
Command Windows
H口然后输入命oQ?/span>
@D:\jbpm-starters-kit-
作者简?br />陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?br />您可以通过其博客了解更多信息和文章Q?/font>http://www.ChenGang.com.cn
工作虽然还在不成熟的发展阶D,甚至q没有一个公认的规范标准。但其应用却已经在快速展开Q这说明市场对工作流框架的需求是急迫而巨大的?/span>
我们公司的后台短信管理系l涉及短信编发、领导层层审核等操作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 的正处在不断发展中,做ؓ开源Y件的特点Q其设计变化往往很大。所以一些过ȝ资料可能已经不适用了。于是作者根据自q使用l验Q重新整理出q䆾文档Q以备学习参考?/span>
注:本文使用?/span> jBPM 版本?/span> 3.1.1
所?/span> JAVA 开发第一个需要安装的Q没什么好说的。记得把pȝ变量 JAVA_HOME 设上?/span>
Ant 是?/span> jBPM 必须的一个工兗?/span> jBPM 中的很多操作都要用到 Ant ?/span>
安装Ҏ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变量: ANT_HOME=d:\ant ?/span>
Q?/span> 4 Q把 %ANT_HOME%\bin 加入到系l变?/span> PATH 中?/span>
Eclipse 不是开?/span> jBPM 必须的工P但它是对 jBPM 开发很有帮助的工具Q特别是 jBPM 提供了一?/span> Eclipse 插g用来辅助开?/span> jBPM 。关?/span> Eclipse 的安装不赘述了,本文用的版本是: 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包、开发插件、一个配|好了的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目录下含有五个子目录:
l jbpm jBPM 的Y件包
l jbpm-bpel 只含有一个网?/span>
l jbpm-db 各种数据?/span> hibernate 配置文gCZQ有些还包含了相应的 jdbc 驱动E序?/span>
l jbpm-designer 辅助开?/span> jBPM ?/span> Eclipse 插gQ具体在 jbpm-gpd-feature 子目录中
l jbpm-server 一个已l配|好了的Z JBoss ?/span> jBPM CZ .
前面我们说了Q在 JBoss jBPM Starters Kit ?/span> jbpm-server 目录是一个已l配|好的了 jBPM CZQ那么让我们来感觉一?/span> jBPM 做出的东西吧?/span>
双击 jbpm-server 目录下的 start.bat 文gQ启?/span> JBoss 服务。这时会打开一?/span> DOS H口Q启动完成后Q日志会不断输出Q其中最后一句是?/span> 13:55:39,937 DEBUG [StaticNotifier] going to wait for (CMD_EXECUTOR, java.lang.Object@1df59bd) ”,q表C?/span> jBPM 在开始工作了Q它不断q行轮询?/span>
打开|页Q?/span> http://localhost:8080/jbpm/ 得到如下画面
q是一个已l用 jBPM 开发好的用户定单流E,h下单、审核、估L程。它所用的数据库是一个内|的数据库?/span>
?/span> cookie monster 用户dQ选择?/span> create new web sale order ”可以创Z个定单。如下图所C,在图左边是填写的定单情况Q右边一整个定货程的示意图Q红色框表示程q行到哪一步了。填写好定单好,选择?/span> Save and Close Task ”,完成定单提交?/span>
选择右上角的?/span> Login as another user ”以另外一个用户名 ernie d。这时可以看?/span> ernie 用户的Q务列表中多了一V?/span>
点进dQ显C如下画面。这个示例对中文的支持不好,全都昄成了 unicode 码了。不这什么多Q反正知道是q么回事p了。在 comment 填写意见,?/span> OK 按钮Q进入到下一步。如果选择 more info needed 按钮Q则打回l?/span> cookie monster 用户修改定单?/span>
下面的流E,q里׃再赘qC。在q个很标准的工作示例中Q我们基本可以看?/span> jBPM 的应用范围还是比较广的。而且从这个示例,我们是看不出?/span> jBPM 的,也就是说 jBPM 在后台v着作用?/span>
从这个例子,q看不出 jBPM 的优ѝ不q,如果在一个流E不定Q经帔R要变动的目中, jBPM 的好处将会显然出来。应?/span> jBPM 后,改变程只需改变程描述文gQ这在后面的内Ҏ到?/span>
q是一个已做好的示例,接下来我们将仉K这个实例来开发一个请假流E?br />
作者简?/strong>
陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?br />您可以通过其博客了解更多信息和文章Q?a >http://www.chenGang.com.cn