当我负责将流程引擎集成到我的一个项目中时,我很快决定支持Activiti 。 Activiti是jBPM 4的下一个版本,与BPMN 2.0兼容,有据可查,并具有与Spring集成的现成模块。 不幸的是,由于命运的残酷折磨,我被自己的等级制度所否定(由于一些琐碎的原因,我不敢在这里写东西),我不得不使用jBPM。 本文试图列出我在这段史诗般的旅程中中学到的所有课程。
第1课:jBPM文档还不够
第二课:不是因为没有文档,所以没有
jBPM 4包装了所有必需的组件以通过Spring引导jBPM,即使它对如何执行操作却保持沉默。 谷歌在这里没有帮助,因为每个人似乎都在推断自己的解决方案。出于好奇,我终于结束了这样做:
例如,以下是我发现一些声明为jBPM配置bean的方法:
<beanid="jbpmConfiguration"class="org.jbpm.pvm.internal.processengine.SpringHelper">
<propertyname="jbpmCfg">
<value> jbpm.cfg.xml </value>
</property>
</bean>
起初,我害怕在包含可怕的``内部''一词的包中使用一个类,但这似乎是唯一的方法...
第3课:Google并不是您的真正朋友
是吗 实际上,我还发现了以下配置片段:
<beanid="jbpmConfiguration"class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
<constructor-argvalue="jbpm.cfg.xml"/>
</bean>
而且我认为,如果您搜索足够长的时间,就会找到许多其他方法来实现引擎配置。 这是缺少文档的问题:我们的开发人员是聪明的人,所以无论如何我们都会找到一种使之起作用的方法。
第4课:不要忘记配置日志记录框架
这个不是jBPM特有的,但是它很重要。 我浪费了很多时间,因为我愚蠢地忽略了警告我有关Log4J找不到其配置文件的消息。 创建了该死的东西之后,当我以编程方式部署新的jPDL文件时,我终于可以阅读到一条重要的信息:
WARNING: no objects were deployed! Check if you have configured a correct deployer in your jbpm.cfg.xml file for the type of deployment you want to do.
第五课:真理在代码中
这是上一课的直接结果:由于我已经仔细检查了文件的扩展名为jbpm.xml,并且在我的配置中正确设置了jBPM部署程序,因此我必须了解代码的实际作用。 最后,这意味着我必须在IDE中获取源代码并进行调试,以观察幕后情况。 罪魁祸首是以下几行:
repositoryService.createDeployment().addResourceFromInputStream("test",newFileInputStream(file));
因为我在文件上使用了流,而不是流本身,所以我必须提供一个虚假的资源名称(“测试”)。 检查了后者的jpdl.xml文件扩展名,当然失败了。 但是通过阅读错误消息并不能很明显地看出来。
repositoryService.createDeployment().addResourceFromFile(file);
当然,所引用的文件具有正确的jbpm.xml扩展名,并且像一个魅力一样工作。
第6课:不要重新发明轮子
与第2课和第3课紧密结合,我发现了许多片段,它们充分描述了jbpm.cfg.xml配置文件。 尽管可以正常工作(嗯,我希望如此,因为我没有对其进行测试),但它过大,容易出错,并且可能表明了Google使用过多(相对于大脑使用)。 例如,在Google Code上发布的jbpm4-spring-demo项目提供了完整的配置文件 。 通过冗长的反复试验过程,我设法用更短的配置文件(重用现有的配置摘要)获得成功:
<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configurationxmlns="http://jbpm.org/xsd/cfg">
<importresource="jbpm.default.cfg.xml"/><!-- Default configuration -->
<importresource="jbpm.tx.spring.cfg.xml"/><!-- Use Spring transaction management -->
<importresource="jbpm.jpdl.cfg.xml"/><!-- Can deploy jPDL files -->
</jbpm-configuration>
第7课:jPBM可以访问Spring上下文
jBPM提供了java
活动来调用一些任意的Java代码:它可以是EJB,但是我们也可以将Spring上下文连接到jBPM,以使前者可以被后者访问。 修改以前的配置很容易做到:
<jbpm-configurationxmlns="http://jbpm.org/xsd/cfg">
<importresource="jbpm.default.cfg.xml"/>
<importresource="jbpm.tx.spring.cfg.xml"/>
<importresource="jbpm.jpdl.cfg.xml"/>
<process-engine-context>
<script-managerdefault-expression-language="juel"
default-script-language="juel"
read-contexts="execution, environment, process-engine, spring"
write-context="">
<script-languagename="juel"factory="org.jbpm.pvm.internal.script.JuelScriptEngineFactory"/>
</script-manager>
</process-engine-context>
</jbpm-configuration>
请注意,我尚未找到此代码段的现有代码段,欢迎反馈。
第8课:根据需要使用JTA事务管理器
您的jBPM数据库可能将拥有一个业务数据库。 在大多数公司中,DBA会轻轻地要求您将它们置于不同的架构中。 在这种情况下,不要忘记在某些XA数据源中使用JTA事务管理器来使用两阶段提交。 在测试中,最好使用相同的架构,并且基于数据源的简单事务管理器就足够了。
对于需要另一种方法来配置其jBPM / Spring集成的人员,以下是我以Maven / Eclipse格式使用的源 。 我希望我的做法更加务实。 在所有情况下,请记住我是该产品的新手。
翻译自: https://blog.frankel.ch/lessons-learned-from-integrating-jbpm-4-with-spring/