电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

编程方式部署jBPM工作流


发布日期:2020/2/13
 

本文介绍了编程方式部署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!

上一篇:JVM技术,反射与动态代理

下一篇:写txt文件在AIX5.3系统中乱码