最近在研究jBPM,碰到了一大堆问题,这个郁闷的了。不过到今天为止,终于小有成果,可喜可贺啊,:)
下面主要讲一下最近碰到的一些问题,疑问以及解决方案
1、流程的测试
刚开始不知道怎么用插件,流程代码都是手写的,结果等我好不容易写完之后发布,发现无法编译这个流程文件,这个郁闷啊。肯定是我哪里写错了。然后去找有没有dtd文件,结果好不容易找到了,但是好像没有起作用,我很奇怪,怎么这么好的东西,会没有dtd文件呢。最后还是决定用插件,因为找到了一篇怎么用插件的文章,原来所有的东西都可以做的,哈哈哈。真是不错。
还有一个比较郁闷的地方就是jBPM的api doc,这个简直就不是doc,里面基本上没有说明文字,晕倒。这就是所谓jboss出品,真想扁他们。结果每次出了问题都要到网上乱搜一汽,运气好还能找到一点有用的东西。以上纯属牢骚。
下面说一下测试。
我是用编程的方式发布我的流程的
代码如下,自己写的一个发布类
但是这个发布类有一个问题,无法发布jpg文件到数据库,不过似乎在测试阶段也不需要图片。正式发布的时候,可以通过插件直接上传到服务器。
还有一个疑问,user guide 里说Process archives can also be deployed programmatically with the class org.jbpm.jpdl.par.ProcessArchiveDeployer ,但是这个类在3.1.2里面根本没有,不知道怎么回事
然后编写unit test ,在单元测试里面,针对每个流程路径进行测试。
2、流程发布
在完成单元测试之后,就可以通过插件直接上传到服务器了,不过事先你的服务器要有上传发布的功能。我的是直接从websale修改过来了。让这个demo跑起来,花了好大的劲。主要是版本问题。最大的一个问题在JbpmContext的创建上面。
原来的是这个样子:JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
但是这个方法在新版本中已经不支持,而且好像还不能很好的功能。从字面意思来看,应该是获得当前存在的context,但是,context只有close之后才能把相应的事务提交,所以这个几乎每次我都新创建了一个。
就想其他人一样,也有点不是很理解,为什么都已经save的,怎么还没有提交。既然要close才commit,那要getCurrentJbpmContext()方法有什么用了。
最后我的折中办法
- JbpmConfiguration config = JbpmConfiguration.getInstance();
- JbpmContext jbpmContext = config.getCurrentJbpmContext();
- if (jbpmContext == null) jbpmContext = config.createJbpmContext();
在context这个问题上,就判断一下是否为空,如果空的话就创建一个,就像我上面说的,每次只有close了才能把事务提交,估计这个context也就没有了,每次都是要创建的。
这个问题,是我在调试web程序 的时候出现最多的问题,每次都是NullException,晕死了。结果都是context 空的问题。也不知道jboss每次版本更新之后怎么不把demo也改一下,彻底的服了。
3、其他问题
还有一个就是JSF问题,在使用CommondLink这个组件的时候,一定要把这个组件包含在Form里面,也不知道这个是JSF的bug,还是其他的原因,这个问题也折腾了我好久,后来搜了一下,原来也有很多人有这个问题,狂晕啊。sun不至于这么菜吧,唉。
先写到这里吧,到现在总算能把我的web跑起来,也能看到我的流程图,真是开心啊。简单的流程也能跑了,下面继续努力。要实现负责的流程还有很多路要走。最复杂的还是流程的实现以及与外部逻辑的整合问题。加油。。。。