本文介绍了编程方式部署jBPM工作流定义的方法并向您提供了源代码只要您正确配置了Jbpm的数据库和Hibernate使用本文提供的这个工具类就可以非常方便的部署您创建的jbpm工作流定义
部署jBPM工作流要使用jBPM的工作流必须首先部署工作流定义就是把工作流定义文件载入到jBPM的数据库中 jBPM的工作流有多种部署方式包括:Ant文件部署Eclipse图形设计器通过JBoss(JBoss上必需运行jbpmwar)部署以及本文我要介绍的编程部署的方式 一Ant文件发布方式 编写Ant文件非常复杂因为jBPM工作流的部署需要使用Jbpm数据库这就必须要进行繁琐的配置 二Eclipse图形设计器直接部署 这种方式非常简单但是这种部署方式必须要同时运行JBoss服务器并且需要在JBoss上运行配置正确的jbpmwar它会把业务程序定义发布到jbpmwar使用的数据库上 而jbpmwar的部署和配置非常麻烦特别是你要更改使用的数据库时JBoss的一大特点就是配置方式不标准与通用的配置方式相差甚多 因此我不喜欢配置JBoss下的jbpmwar我已经创建了新的可以部署到Tomcat等所有服务器上的jbpmwar文件(我会在有空时推出一篇文章介绍如何制作可以运行在所有JavaEE服务器上的jbpmwar文件并提供直接下载) 但是部署在Tomcat上的jbpmwar不能支持Eclipse图形设计器部署业务程序定义 而且今天我重装Eclipse之后安装的图形设计器没有了发布功能!汗!可能是需要安装Eclipse的某些插件吧!今天我无法访问外国网站所以找不到原因和解决办法(又是中国特色) 三编程方式部署Jbpm业务程序(就是常说的工作流)定义 因为今天我无法使用Eclipse图形设计器直接部署所以就写了一个类通过编程的方式直接部署 这种方式也是非常简单而直接的不需要再安装Eclipse图形设计器也不需要配置和运行支持jBPM的JBoss 只要你的应用程序中集成并正确配置了jBPM(可以参考我的Blog上的文章《向应用程序中加入jBPM组件》 )然后把下面的类加入你的项目运行JUnit测试或者执行main方法就可以轻松的部署你的业务程序定义了!
编程方式部署Jbpm工作流定义一基本知识 JUnit测试和执行main方法实际上是classpath目标目录下的class文件的运行查找资源文件也是从classpath开始的 我们的Web项目应用程序classpath是webinf/classes我们的业务程序定义文件所在目录processes设为src目录所以路径应该是业务程序定义名字/processdefinitionxml 这里我的业务程序定义的名字是checkShowNews所以classpath的路径应该是checkShowNews/processdefinitionxml 二部署业务程序定义的工具类 下面是这个类的源文件可以通过Main方法和Junit测试部署业务程序定义 /** * */ package monutil; import orgjbpmJbpmConfiguration; import orgjbpmJbpmContext; import orgjbpmgraphdefProcessDefinition; import junitframeworkTestCase; /** * @author 沈东良 * :: PM * DeployJbpmProcessDefinition类提供了部署JBpm工作流定义到数据库的功能! */ public class DeployJbpmProcessDefinition extends TestCase { static JbpmConfiguration jbpmConfiguration = null; static { jbpmConfiguration = JbpmConfigurationgetInstance(); } public void setUp() { //创建数据库表 //jbpmConfigurationcreateSchema(); } public void tearDown() { //删除数据库表 //jbpmConfigurationdropSchema(); } /** * 测试方法 * */ public void testSimplePersistence() { // Between the method calls below all data is passed via the // database Here in this unit test these methods are executed // right after each other because we want to test a complete process // scenario情节 But in reality these methods represent different // requests to a server // Since we start with a clean empty inmemory database we have to // deploy the process first In reality this is done once by the // process developer /** * 这个方法把业务处理定义通过Hibernate保存到数据库中 */ deployProcessDefinition(checkShowNews/processdefinitionxml); } /* <processdefinition xmlns= name=checkShowNews> <swimlane name=CheckNewsManagers> <assignment class=comwithubwcmsmanagepublishNewsjbpmHandlerassignmentHandlerCheckNewsAssignmentHandler configtype=bean></assignment> </swimlane> <swimlane name=EditNewsUser> <assignment class=comwithubwcmsmanagepublishNewsjbpmHandlerassignmentHandlerEditNewsAssignmentHandler configtype=bean></assignment> </swimlane> <startstate name=relatingNewsChannel> <transition name= to=checkNews></transition> </startstate> <tasknode name=checkNews> <task name=checkNews swimlane=CheckNewsManagers></task> <transition name=rejected to=editNews></transition> <transition name=passed to=showNews></transition> </tasknode> <endstate name=end></endstate> <tasknode name=editNews> <task name=editNews swimlane=EditNewsUser></task> <transition name=commited to=checkNews></transition> </tasknode> <node name=showNews> <action name=showNewsAction class=comwithubwcmsmanagepublishNewsjbpmHandleractionHandlerShowNews configtype=bean/> <transition name= to=end></transition> </node> </processdefinition> */ /** * checkShowNews/processdefinitionxml */ public void deployProcessDefinition(String filePath) { // This test shows a process definition and one execution // of the process definition The process definition has // nodes: an unnamed startstate a state s and an // endstate named end ProcessDefinition processDefinition = ProcessDefinitionparseXmlResource(filePath); // Lookup the pojo persistence contextbuilder that is configured above JbpmContext jbpmContext = jbpmConfigurationcreateJbpmContext(); try { // Deploy the process definition in the database jbpmContextdeployProcessDefinition(processDefinition); } finally { // Tear down the pojo persistence context // This includes flush the SQL for inserting the process definition // to the database /* * 关闭jbpm上下文删除pojo持久化上下文 * 这包括刷新SQL来真正的把业务处理定义插入到数据库中 * */ jbpmContextclose(); } } /** * * @param args */ public static void main(String[] args){ DeployJbpmProcessDefinition instance=new DeployJbpmProcessDefinition(); instancedeployProcessDefinition(args[]); } }
三Eclipse下使用main测试的方法 点击Run选项
选中Main方法测试的 )项目需要classpath所有的class文件jar包和资源文件所在地 )main方法所在的类 由于我们的main方法使用了一个参数所以需要提供一个参数就是jBPM业务程序定义文件相对于项目的classpath的相对路径 点Run运行OK! |