这两天在学习jbpm,构建环境就搭配了一天,NND,现在将我自己的辛酸史写下来。
1.构建环境:myeclipse9.1 , jbpm3.1.4,jdk1.6(开始的时候我选择是eclipse3.7,发现jbpm的插件不能安装,搞了半天就换了eclipse3.2就可以了,但是eclipse3.2里很多其他的插件都没有,不方便我开发,其实我一直使用的是myeclipse,只不过为了和实验室统一才换的eclipse。于是我就又换回来了,事实证明myeclipse9.1可以很轻松的装上jbpm的插件);
2.去sourceforge上下载jbpm3.1.4并解压,将jbpm-starters-kit-3.1.4\jbpm-designer\jbpm-gpd-feature\eclipse下的两个文件夹复制到MyEclipse 9\dropins下的对应文件夹里(注意新安装的myeclipse9.1是没有这2个文件夹的,要自己新建,我就在这里搞了半天,而低版本的myeclipse,比如6.0版本,直接由features和plugins文件夹,所以简单点,这是因为高版本的myeclipse都不再支持links安装了,谨记!!!),重启myeclipse,在window-》perferences里就可以看到JBOSS JBPM了。点击runtime location-》add,输入name:jbpm3.1.4和location:D:\学习软件\jbpm-starters-kit-3.1.4\jbpm(对应自己的安装路径)即可,jbpm就配置完了;
3.由于jbpm的流程定义都是存放在数据库里的,所以需要导入jbpm的表,以sql2000为例,首先建立一个”jbpm“的数据库,sql脚本在D:\学习软件\jbpm-starters-kit-3.1.4\jbpm-db\build\mysql\scripts下,在查询分析器里执行脚本就ok啦,数据库迁移完成;
4. 入门书籍《jbpm开发指南》,至于开头的构建环境的搭建就不要看了,而迁移数据库那里更不用了,你不会去导入jbpm项目的,因为里面源码有错误,编译出错,越看越麻烦,错误一大堆啊!!!
5. 在myeclipse里现在就可以新建JBPM的项目了,在new->other->JBOSS JBPM->Process Project ,包和路径自动都为你分好了,可以写helloworld程序了,这里给个模板:
package com.sample;
import junit.framework.TestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
public class HelloWorldTest extends TestCase {
public void testHelloWorldProcess() {
/*
这个段测试方法演示了一个流程的在代码中以字符串形式定义和这个流程定义的具体执行。
这个流程定义包含三个节点:一个未命名的开始状态(start-state),
一个名字为's'的状态(state)和一个名字为'end'的结束状态(end-state)。
下一行的功能是把一段xml文本解析为一个ProcessDefinition,
一个ProcessDefinition是一个java对象的形式对流程的正式的描述。
*/
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <start-state>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <transition to='end' />" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
/*
下边的一行根据流程定义构造了的一个具体的执行实例。 构造以后,执行的流程就有了一个被定位在开始状态(start-state)上的主要的执行路径
*/
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
/*
构造以后,执行的流程就有了一个主要的执行路径(root token)
*/
Token token = processInstance.getRootToken();
/*
当然,构造以后,流程定义的主要的执行路径被定位在开始状态(start-state)
*/
assertSame(processDefinition.getStartState(), token.getNode());
/*
开始流程执行,通过默认的转换(transition)离开开始状态(start-state)
*/
token.signal();
/*
直到运行的流程进入一个等待状态,signal方法将一直被阻塞,运行的流程将要进入第一个等待状态:状态‘s’.因此现在主要的执行路径,定位到了状态‘s’上。
*/
assertSame(processDefinition.getNode("s"), token.getNode());
/*
执行signal,流程将继续执行,将通过默认的转换(transition)离开状态‘s’
*/
token.signal();
/*
流程实例已经到达了结束状态。
*/
assertSame(processDefinition.getNode("end"), token.getNode());
}
}