You are browsing the archive for Eclipse.

jBPM开发:实现一个简单的审批流程

3:30 pm in Java开源 by aronezhang

 

本文使用jBPM自带的身份认证组件模型来实现一个简单的审批流程,其中使用到的技术点在本文中暂且

不解释,就先来一个先睹为快,对jBPM最常用的功能有一个感性的认识,在后面的文章中慢慢解释各个技术点,

进一步的加深jBPM的应用。

 

1,数据准备

 

jBPM的身份认证组件基于以下几张表:

  1. JBPM_ID_GROUP:组模型的层次关系
  2. JBPM_ID_MEMBERSHIP:模型组下的成员关系
  3. JBPM_ID_USER:成员信息

 

为了进行展示,我们先创建一些基础数据来测试后面创建的审批工作流

1
2
3
4
5
6
7
8
9
10
11
12
13
insert into JBPM_ID_GROUP (ID_, CLASS_, NAME_, TYPE_, PARENT_)
values (1, 'G', '资源管理室', 'UM', 2);
 
insert into JBPM_ID_MEMBERSHIP (ID_, CLASS_, NAME_, ROLE_, USER_, GROUP_)
values (6, 'M', null, 'role_superadmin', 1, 1);
insert into JBPM_ID_MEMBERSHIP (ID_, CLASS_, NAME_, ROLE_, USER_, GROUP_)
values (7, 'M', null, 'departmentManager', 2, 1);
 
insert into JBPM_ID_USER (ID_, CLASS_, NAME_, EMAIL_, PASSWORD_)
values (1, 'A', 'aronehome1', 'arone.lijun@gmail.com', '111111');
insert into JBPM_ID_USER (ID_, CLASS_, NAME_, EMAIL_, PASSWORD_)
values (2, 'A', 'aronehome1', 'arone.lijun@gmail.com', '111111');
commit;

 

2,定义流程

 

使用jBPM的流程定义向导来创建一个新的流程定义

  1. 首先在src/java目录下创建java包结构com.hand.processes
  2. 启动jBPM流程定义向导定义流程:表达式审批流程
    Source Folder:jBPMDemo/src/java/com/hand/processes
    Process Name:expression_approve
  3. 选择左边工具面板中的图标,后点击右边的画布创建流程中的各节点
  4. 添加节点后使用 clip_image001 将各节点连接起来

 

完成后的效果如下图:

clip_image002

 

<<Task Node>>审批任务节点中,右键选择审批任务节点,添加一个任务,如下图:

clip_image002[6]

 

clip_image002[8]

 

Task Name:审批

Assignment Type:Expression

Assignment Expression:group(资源管理室)–>member(role_superadmin)

这个表达式利用了jBPM自带的身份组件模型,只要指定组的名称和角色的名称,jBPM会自动找出符合条件的用户,并为她们创建任务实例。

 

上面的审批流程说明流程启动之后就等待一个任务的执行,这个任务由组为:资源管理室,并且角色为:role_superadmin 的用户,

因此我们上面的数据中找到的用户就是aronehome,流程会等待aronehome这个用户的一个动作之后才会继续往下执行,否则一直处于等待状态。

 

 

3,发布流程到数据库

 

由于jBPM流程运行的时候,它是从数据库中读取相关的流程定义信息,因此开发完成流程之后需要先将流程定义信息发布到数据中。

在Myeclipse设计器中选择Deployment,选择本地保存方式,先将流程定义文件和图片打包为zip文件,选择如下图点击“Save Without Deploying…”按钮

clip_image002[10]

 

然后运行之前创建的“流程发布页面”:

http://localhost:7001/jbpmWeb/deploy.html

选择保存的zip文件,发布后可以到数据库中去验证流程是否成功。

1
SELECT * FROM jbpm_processdefinition WHERE name_ = '表达式审批流程';

 

 

4,启动jBPM流程

 

启动流程可以采用如下的两种方法

  1. 使用jBPM控制台管理页面来启动流程(操作步骤省略)
  2. 编写测试脚本来启动流程,主要的启动代码:
1
2
ProcessInstance processInstance = JbpmConfiguration.parseResource("jbpm.cfg.xml").createJbpmContext().newProcessInstance("表达式审批流程");
processInstance.signal();

 

 

5,查看流程执行图

 

先查询出流程中的任务实例ID(此SQL仅能用于开发中不严格的数据查询):

1
2
3
4
5
6
7
8
SELECT id_, name_, actorid_
  FROM jbpm_taskinstance
 WHERE token_ = (SELECT MAX(roottoken_)
                   FROM jbpm_processinstance
                  WHERE processdefinition_ =
                        (SELECT MAX(id_)
                           FROM jbpm_processdefinition
                          WHERE name_ = '表达式审批流程'));

 

运行之前创建的“流程执行情况查看页面”:

http://localhost:7001/jbpmWeb/showDiagram.jsp

输入上面SQL查询处理的taskinstance id,效果图如下:

clip_image002[12]

 

上图说明流程执行到审批这个任务节点,等待用户做出响应。

 

 

下一篇文章开始描述jBPM的主要组成。

 

 

jBPM开发:配置Eclipse IDE开发环境

3:28 pm in Java开源 by aronezhang

 

上文已经介绍了如何将jBPM Console应用发布到 Weblogic服务器,下面描述如何配置 Eclipse 开发环境,以提高后面jBPM开发的工作效率。

 

Jboss为jBPM提供了基于Eclipse的插件工具,因此开发人员可以使用原生的Eclipse IDE,也可以使用Myeclipse这样的集成工具。

本人使用Myeclispe作为开发工具,因此本文基于Myeclipse作为配置的环境

 

一、配置开发工具

 

1,安装Eclipse Designer到Myeclipse6

将jbpm-jpdl-suite-3.2.3/designer/eclipse/plugins目录下的文件及文件夹拷贝到myeclipse安装目录下的eclipse/plugins目录下之后,重起myeclipse即可

 

2,安装Eclipse Designer到Myeclipse7

首先是将jBPM设计器的插件,即jbpm-jpdl-suite-3.2.3/designer/eclipse/plugins目录下的文件及文件夹 拷贝到一个特定的目录,

如:D:\Genuitec\MyPlugins\jbpm-jpdl-designer-3.1.5;

后修改CreatePluginsConfig.java中的代码:new CreatePluginsConfig(“D:\\Genuitec\\MyPlugins\\jbpm-jpdl-designer-3.0.11″).print();

将路径修改为jBPM设计器插件的目录,并使用双斜杠(\\)代替单斜杠(\),运行它之后控制台会有结果输出。

之后将输出的结果拷贝添加到Myeclipse7安装目录下的configuration\org.eclipse.equinox.simpleconfigurator\bundles.info文件中

以clean的方式启动Myeclipse,命令:myeclipse.exe –clean

CreatePluginsConfig请参考前面的博文MyEclipse7下安装插件

 

3,添加jBPM设计和运行环境

启动myeclipse之后,通过windows –> Preferences –> JBoss jBPM添加jBPM运行环境,路径指向jbpm-jpdl-suite-3.2.3的位置。

clip_image002

 

 

二、配置开发环境

 

1,创建jBPM流程项目

安装jBPM设计器之后,可以在myeclipse新建向导中找到JBoss jBPM –> Process Project ,根据向导创建一个jBPM流程项目。

创建之后的jBPM项目结构如下:

clip_image002[6]

 

2,修改数据库连接信息

修改hibernate.cfg.xml文件中关于数据库连接的信息,可以根据实际情况选择其中的一种连接方式:JDBC Driver和JNDI DataSource。

JDBC Driver的方式:

1
2
3
4
5
org.hibernate.dialect.Oracle9Dialect
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:xe
gdcms
gdcms1

JNDI DataSource方式:

1
java:comp/env/jdbc/jbpmDB

采用JNDI的方式需要在Weblogic服务器上面定义DataSource。

 

3,添加jar库文件

路径:<项目> –> 属性 –> Java Build Path –> Libraries –> Add External JARs

添加如下的库文件:
ojdbc14.jar
c3p0-0.9.0.jar:如果hibernate.cfg.xml配置中启用c3p0连接池需要提供
hibernate3.jar
jbpm-webapp-3.1.2.jar

 

 

三、配置本地发布环境

 

在进行jBPM工作流开发的过程中,开发人员可以在jBPM管理控制台中发布流程定义到数据库中;

也可以通过在Myeclipse工具中配置web应用来发布流程定义。本节描述如何利用Myeclipse在开发环境

中配置web应用来发布流程定义以及查看执行的流程图。

 

1,创建Web项目

利用Myeclipse的Web Project新建向导创建一个Web项目。

clip_image002[8]

 

2,拷贝配置和tag库文件

将上面创建jBPM项目后并配置好的相关配置文件拷贝到新建的web应用项目下,需要将jBPM项目下src/config.files文件目录拷贝到web项目下

从下载的jBPM套件中将jbpm.tld文件拷贝到WEB-INF目录下

添加jar库文件,参考2.3

 

3,修改web.xml配置

jBPM上传流程文件的时候会将流程图(jpg)文件上传到数据库表jbpm_bytearray中,因此需要添加servlet来处理图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	UploadServlet
	org.jbpm.webapp.servlet.UploadServlet
 
 
	ProcessImageServlet
	org.jbpm.webapp.servlet.ProcessImageServlet
 
 
	UploadServlet
	/upload
 
 
	ProcessImageServlet
	/processimage

 

4,添加weblogic.xml配置文件

添加weblogic.xml文件到WEB-INF目录下,主要内容包括:

1
2
3
4
 
		true
 
     /jbpmWeb

 

5,增加发布流程页面

在WebRoot路径下添加jBPM流程发布流程页面deploy.html,页面的代码如下:

?View Code HTML4STRICT
1
2
3
4
5
6
7
8
9
10
 
    <title>Deploy a Process Archive File</title>
 
 
    <h2>Let's Deploy a Process</h2>
    <form action="upload" enctype="multipart/form-data" method="post" />
      Select the file you want to upload : 
      <br>
 
    </form>

运行效果:

clip_image002[10]

 

6,增加流程执行情况查看页面

在WebRoot路径下添加jBPM流程运行页面showDiagram.jsp,只要流程运行之后,提供任务的实例ID就可以查询出流程执行情况,

并标记出停留在哪个任务节点上面,页面的代码如下:

?View Code HTML4STRICT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
 
 
 
 
<title>提供任务实例ID查询流程执行图</title>
 
 
 <form method="post" action="showDiagram.jsp">
	<p>
		Task Instance ID: <br>
 
	</p>
</form>

效果图:

clip_image002[12]

 

 

下一篇文章就正式进入jBPM工作流的开发。

 

Myeclipse工程项目文件:Download Oracle EBS二次开发系列视频教程之在Oracle EBS中注册Form和Function(5) Version 1

 

MyEclipse7下安装插件

3:55 pm in Java开源 by aronezhang

?

?

MyEclipse7下安装插件和原来的版本有很大的差异,很多插件无法进行自动安装,下面记录一下从网上找到的解决方案。

?

下面以安装jbpm-jpdl-designer-3.0.11插件为实例进行说明:

1,下载插件,解压后将plugin中的文件拷贝到目录D:\Genuitec\MyPlugins\jbpm-jpdl-designer-3.0.11

2,修改com.oracleseeker.tools.CreatePluginsConfig.main中文件路径的值,需要将斜杠修改为双斜杠,并运行它

3,进入MyEclipse7的安装路径,找到Genuitec\MyEclipse 7.0\configuration\org.eclipse.equinox.simpleconfigurator\bundles.info

4,将2运行时控制台输出的内容添加到bundles.info文件的最后

5,通过命令行以clean模式启动MyEclipse:myeclipse.exe –clean

?

CreatePluginsConfig类的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.oracleseeker.tools;
 
import java.io.File;
import java.util.ArrayList;
import java.util.List;
 
public class CreatePluginsConfig {
 
	private String path;
 
	public CreatePluginsConfig(String path) {
		this.path = path;
	}
 
	public void print() {
		List list = getFileList(path);
		if (list == null) {
			return;
		}
 
		int length = list.size();
		for (int i = 0; i &lt; length; i++) {
			String result = "";
			String thePath = getFormatPath(getString(list.get(i)));
			File file = new File(thePath);
			if (file.isDirectory()) {
				String fileName = file.getName();
				if (fileName.indexOf("_") &lt; 0) {
					continue;
				}
				String[] filenames = fileName.split("_");
				String filename1 = filenames[0];
				String filename2 = filenames[1];
				result = filename1 + "," + filename2 + ",file:/" + path + "\\"
						+ fileName + "\\,4,false";
				System.out.println(result);
			} else if (file.isFile()) {
				String fileName = file.getName();
				if (fileName.indexOf("_") &lt; 0) {
					continue;
				}
				int last = fileName.lastIndexOf("_");
				String filename1 = fileName.substring(0, last);
				String filename2 = fileName.substring(last + 1, fileName
						.length() - 4);
				result = filename1 + "," + filename2 + ",file:/" + path + "\\"
						+ fileName + ",4,false";
				System.out.println(result);
			}
		}
	}
 
	public List getFileList(String path) {
		path = getFormatPath(path);
		path = path + "/";
		File filePath = new File(path);
		if (!filePath.isDirectory()) {
			return null;
		}
		String[] filelist = filePath.list();
		List filelistFilter = new ArrayList();
 
		for (int i = 0; i &lt; filelist.length; i++) {
			String tempfilename = getFormatPath(path + filelist[i]);
			filelistFilter.add(tempfilename);
		}
		return filelistFilter;
	}
 
	public String getString(Object object) {
		if (object == null) {
			return "";
		}
		return String.valueOf(object);
	}
 
	public String getFormatPath(String path) {
		path = path.replaceAll("\\\\", "/");
		path = path.replaceAll("//", "/");
		return path;
	}
 
	public static void main(String[] args) {
		//new CreatePluginsConfig("C:\\eclipse-plugins\\plugins\\JBossTools-2.1.2.GA-ALL-win32").print();
		new CreatePluginsConfig("D:\\Genuitec\\MyPlugins\\jbpm-jpdl-designer-3.0.11").print();
 
	}
}