??xml version="1.0" encoding="utf-8" standalone="yes"?> RestController.java的发布处理代码:(x) GUI直接使用swingQ目前只实现在鼠标单?yn)LQ插入一个节点,主要实现代码c:(x) GraphImpl.java代码 详细代码可以自己看附件的代码?/p>
源码jgraphxflow.rar
]]>
jbpm4.4
hsqldb
hibernate
其中h(hun)sqldb和hibernate都是从jbpm4.4的lib文g多w面拷q去的?br />
本篇不再介绍jbpm与spring集成和spring mvc两方面的内容Q有需要,L(fng)之前的文?br />
jbpm4.3与spring集成L(fng)http://www.aygfsteel.com/pengo/archive/2010/01/04/308219.html
spring3.0 mvc和rest例子请?a title="http://www.aygfsteel.com/pengo/archive/2010/07/03/325164.html" href="http://www.aygfsteel.com/pengo/archive/2010/07/03/325164.html">http://www.aygfsteel.com/pengo/archive/2010/07/03/325164.html
本篇只实C个功能,上传程定义文g和发布该上传的流E定义文件?br />
使用的流E定义文件是使用上一jbpm程设计器生成的定义文gQ?br />
有关jbpm程设计器介l,L(fng)http://www.aygfsteel.com/pengo/archive/2010/08/31/330346.html
程?
把流E图保存为test.jpdl.xml
<?xml version="1.0" encoding="GBK"?>
2<process name="process" xmlns="http://jbpm.org/4.4/jpdl">
3<start name="开?/span>" g="83,34,40,40">
4 <transition name="to d" g="0,0" to="d" />
5</start>
6<task name="d" g="231,78,80,40">
7 <transition name="to l束" g="0,0" to="l束" />
8</task>
9<end name="l束" g="173,188,40,40" />
10</process>
@RequestMapping(value = "/deployAction", method = RequestMethod.POST)
2 public ModelAndView deployAction(HttpServletRequest request,
3 HttpServletResponse response, ModelMap modelMap) {
4 String realPath = request.getSession().getServletContext().getRealPath(
5 "")
6 + "/WEB-INF/deploy/";
7 try {
8 if (ServletFileUpload.isMultipartContent(request)) {
9 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
10 for (Iterator it = multipartRequest.getFileNames(); it
11 .hasNext();) {
12 String key = (String) it.next();
13 MultipartFile file = multipartRequest.getFile(key);
14 if (file.getOriginalFilename().length() > 0) {
15 String filename = file.getOriginalFilename();
16 File saveFile = new File(realPath + filename);
17 FileOutputStream fos = new FileOutputStream(saveFile);
18 //保存上传的流E定义文?/span>
19 fos.write(file.getBytes());
20 fos.flush();
21 fos.close();
22
23 ApplicationContext ctx = new ClassPathXmlApplicationContext(
24 "applicationContext.xml");
25 //调用已定义的Bean
26 ProcessEngine processEngine = (ProcessEngine) ctx
27 .getBean("processEngine");
28 File deployFile = new File(saveFile.getAbsolutePath());
29 if (deployFile.exists()) {
30 // 发布程
31 String deploymentId = processEngine
32 .getRepositoryService().createDeployment()
33 .addResourceFromFile(deployFile).deploy();
34 System.out.println("========================ID:"
35 + deploymentId);
36 modelMap.put("deploy", "发布成功Q版本号?" + deploymentId);
37 }
38
39 }
40 }
41 }
42 } catch (Exception e) {
43 modelMap.put("deploy", "发布p|!" );
44 e.printStackTrace();
45 }
46
47 return new ModelAndView("/deploy", modelMap);
48 }
49
deploy.jsp代码Q?br />
<%@ page language="java" contentType="text/html; charset=GBK"
2 pageEncoding="GBK"%>
3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4<html>
5<head>
6<meta http-equiv="Content-Type" content="text/html; charset=GBK">
7<title>上传</title>
8</head>
9<body>
10<%
11 String deploy = request.getAttribute("deploy").toString();
12%>
13<script>
14alert('<%=deploy%>');
15</script>
16<form name="upform" action="deployAction" method="POST" enctype="multipart/form-data">
17
18 <input type ="file" name="file1" id="file1"/> <br/>
19 <!-- <input type ="file" name="file2" id="file2"/> -->
20 <input type="submit" value="上传" /><br/>
21 </form>
22</body>
23</html>
q行效果Q?br />
本h试环境Qjdk6 + tomcat6.0.20
源码: jbpm4.4_spring3
]]>
]]>
]]>
package com.workflow.designer.view;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
import com.workflow.designer.model.Node;
import com.workflow.designer.util.Logger;
public abstract class GraphImpl extends mxGraphComponent implements MouseListener{
//新徏Jgraph面板Q所有节炚wl制在该面板
private static mxGraph graph = new mxGraph();
public GraphImpl(){
super(graph);
//l面板添加鼠标事?/span>
this.getGraphControl().addMouseListener(this);
}
public abstract void inser(Point p, Node n);
public abstract void mouseClicked(MouseEvent e);
public abstract void mousePressed(MouseEvent e);
public abstract void mouseReleased(MouseEvent e);
public abstract void mouseEntered(MouseEvent e);
public abstract void mouseExited(MouseEvent e);
public mxGraph getGraph() {
return graph;
}
}
GraphView.java代码
package com.workflow.designer.view;
import java.awt.Point;
import java.awt.event.MouseEvent;
import com.mxgraph.view.mxGraph;
import com.workflow.designer.model.Node;
import com.workflow.designer.util.Logger;
public class GraphView extends GraphImpl{
private mxGraph graph = this.getGraph();
private Object parent = graph.getDefaultParent();
public GraphView(){
}
public void inser(Point p, Node n){
this.getGraph().getModel().beginUpdate();
try
{
//调用jgraph插入节点
Object v1 = graph.insertVertex(parent, null, n.getLabel(), p.getX() - 5, p.getY() - 5, n.getWidth(),
n.getHeight(), n.getShape());
}
finally
{
graph.getModel().endUpdate();
}
}
public void mouseClicked(MouseEvent e){
Point p = e.getPoint();
//鼠标点击Ӟ在jgraph面板上插入节?/span>
inser(p, new Node("开?/span>", "start", "shape=ellipse;perimeter=ellipsePerimeter;"));
Logger.debug("mouseClicked");
}
public void mousePressed(MouseEvent e){
Logger.debug("mousePressed");
}
public void mouseReleased(MouseEvent e){
Logger.debug("mouseReleased");
}
public void mouseEntered(MouseEvent e){
Logger.debug("mouseEntered");
}
public void mouseExited(MouseEvent e){
Logger.debug("mouseExited");
}
}
待箋。。。。。。。。。。。?/p>
q行E序jgraphxflow.jar.rar
]]>
版本Q?br />
jbpm4.3
spring2.5.6
mysql5.1.40
直接从jbpm4.3自带的文件到src目录:
从jbpm-4.3"install"src"cfg"hibernate"jdbc复制mysql.hibernate.cfg.xml到src目录Q文件名改ؓ(f)hibernate.cfg.xml?br />
从jbpm-4.3"install"src"cfg"spring复制applicationContext.xml到src目录?br />
从jbpm-4.3"install"src"cfg"jbpm复制spring.jbpm.cfg.xml到src目录Q文件名改ؓ(f)jbpm.cfg.xml?br />
修改applicationContext.xml、hibernate.cfg.xml的数据库配置信息Qjbpm4.3与spring的集成就完成?jin),可以自己写测试文件测试,集成非常?gu)?br />
不过在applicationContext.xml和hibernate.cfg.xml两个文g都要Ҏ(gu)据库信息有点ȝ(ch)Q所以只复制applicationContext.xml、spring.jbpm.cfg.xml两个文g到src目录Q把hibernate.cfg.xml的配|整qspring的配|文件applicationContext.xml中?br />
applicationContext.xml
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="hibernate.properties"
p:ignoreUnresolvablePlaceholders="true" />
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>jbpm.repository.hbm.xml</value>
<value>jbpm.execution.hbm.xml</value>
<value>jbpm.history.hbm.xml</value>
<value>jbpm.task.hbm.xml</value>
<value>jbpm.identity.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${dataSource.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${dataSource.driverClassName}" />
<property name="url" value="${dataSource.url}" />
<property name="username" value="${dataSource.username}" />
<property name="password" value="${dataSource.password}" />
</bean>
</beans>
新徏文ghibernate.properties,主要用来配置q接数据库信?br />
dataSource.username=root
dataSource.databaseName=jbpmdb
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.dialect=org.hibernate.dialect.MySQLInnoDBDialect
dataSource.serverName=localhost:3306
dataSource.url=jdbc:mysql://${dataSource.serverName}/${dataSource.databaseName}
dataSource.properties=user=${dataSource.username};databaseName=${dataSource.databaseName};serverName=${dataSource.serverName};password=${dataSource.password}
dataSource.hbm2ddl.auto=update
试用的程swing.jpdl.xml
<process name="swing" xmlns="http://jbpm.org/4.3/jpdl">
<start g="94,64,48,48" name="start1">
<transition g="-52,-22" name="A" to="A"/>
</start>
<task assignee="A" g="73,195,92,52" name="A">
<transition g="-52,-22" name="B" to="B"/>
</task>
<task assignee="B" g="266,192,92,52" name="B">
<transition g="-40,-21" name="end" to="end1"/>
</task>
<end g="290,327,48,48" name="end1"/>
</process>
试代码
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.start();
ProcessEngine processEngine = (ProcessEngine)applicationContext.getBean("processEngine");
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
//发布程
String deploymentId = processEngine.getRepositoryService().createDeployment()
.addResourceFromClasspath("resource/swing.jpdl.xml").deploy();
System.out.println("程发布ID:"+deploymentId);
//启动一个流E实?/span>
ProcessInstance processInstance = executionService.startProcessInstanceByKey("swing");
System.out.println("程实例ID:" + processInstance.getId());
//A处理d
List<Task> taskList_A = taskService.findPersonalTasks("A");
System.out.println("A待处理Q务数:" + taskList_A.size());
if(taskList_A.size() > 0){
Task task = taskList_A.get(0);
taskService.completeTask(task.getId());
}
//B处理d
List<Task> taskList_B = taskService.findPersonalTasks("B");
System.out.println("B待处理Q务数:" + taskList_B.size());
if(taskList_B.size() > 0){
Task task = taskList_B.get(0);
taskService.completeTask(task.getId());
}
}
}
附g是完整的集成文g和测试代?仅在spring2.5.6试q?要运行该部分代码,需要添加jbpm4.3和spring的相兛_文g?br />
源代?jbpm4.3-spring
]]>
Configuration configuration = new Configuration();
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
String deploymentId = repositoryService.createDeployment().addResourceFromClasspath("org/jbpm/examples/services/Order.jpdl.xml").deploy();
}
1.ProcessEngine
下边的服务接口都可以直接从ProcessEngine中获?它是由Configuration构徏?
Configuration configuration = new Configuration();
ProcessEngine processEngine = configuration.buildProcessEngine();
上边代码是直接构Z个流E引擎processEngine ,默认情况下new Configuration()d的配|文件是src目录下的jbpm.cfg.xml。如果你要用其它的程服务配置Q可以用Configuration的setResource()指定?br />
2.RepositoryService
负责发布程、删除流E、暂?恢复程、查询发布等?br />
3.ExecutionService
启动程实例、执行等待状态的程实例、终止流E实例、删除流E实例、查询实例等?br />
4.TaskService
提供对Q务信息的处理Q获取Q务节点的d人,以及(qing)完成dQ让程跑到下一个节点等Q?br />
5.HistoryService
程的历史信?已完成的程实例、活动、Q??x)被保存到历史数据库表?HistoryService提供对这些历史信息的讉KҎ(gu)?br />
参考资?jbpm4.2安装包中附带的用h?jbpm-4.2/doc/userguide)
]]>
程定义文gswing.jpdl.xml
程?br />
增加两个?
用户表p_user:
USER_ 用户dID
PASSWORD_ 用户d密码
表单数据表p_form:
ID_ 表单~号
TITLE_ 表单标题
CONTENT_ 表单内容
PROCESS_ID 程实例ID
p_form除了(jin)记录表单数据,q记录启动流E实例的ID,q个表负责把表单和流E关联v?
提交表单时的操作,FormPanel.java部分代码:
代码很简?行获取表单的数据,再启动流E实?q把表单数据和流E实例ID一起保存在数据库表p_form.
在用户处理Q务时,先根据用L(fng)ID查找到该用户的待处理d,q把它添加到d列表?
数据库中d用户:
帐号:A 密码:123
帐号:B 密码:123
帐号:D 密码:123
用户Dd
?
?
用户Ad
?
查看待办d
?
用户Bd
?
查看B的待办Q?br />
?
本h的开发环?br />
eclipse3.5
JBPM4.2
mysql-essential-5.1.40-win32
JDK1.6
要运行这个例?需要修改jbpm.hibernate.cfg.xml,DataBase.java数据库的q接信息
试代码:jbpmTest
4.在eclipse上安装流E设计器QGPDQ?有两个安装方法?br />
4.1.使用Eclipse软g升QSoftware UpdateQ机制安装设计器
在gpd目录下有一个gpd/jbpm-gpd-site.zip文gQ?q就是更新站点(archived update siteQ的 压羃包?/p>
在Eclipse里添加更新站点的Ҏ(gu)Q?/p>
帮助 --> 安装新Y?..
点击 d...
?d站点 对话框中Q单?压羃?..
扑ֈ gpd/jbpm-gpd-site.zip q点?'打开'
点击 定 ?d站点 对话框中Q会(x)q回?'安装'对话?br />
选择出现?jPDL 4 GPD 更新站点
点击 下一?. 然后点击 完成
接受协议
当它询问的时候重启eclipse
重新启动Eclipse,直接按Ctrl+N或File→New→other,你可以在对话框中看到有JBoss jBPM下有jBPM 4 Process Definition选项
4.2.自己d|下载设计器
地址Qhttp://sourceforge.net/projects/jbpm/files/在里面选择jBPM Process Designer的最新版本下载(不同的jpd版本要与相应的Eclipse版本对应Q不然会(x)出现一些小问题Q?br />
下蝲回来后,解压出来后把里面featuresQplugins里的包放qEclipse相应文g夹featuresQplugins里面?br />
重新启动Eclipse,直接按Ctrl+N或File→New→other,你可以在对话框中看到有JBoss jBPM下有jBPM 4 Process Definition选项
不过截止今天2009q?2?日,用Eclipse Update得到的GPD版本为jpdl4_1.2.0,而网上下载的是jpdl4_0.0.0,GPD节点的属性与用户指南文档的介l也不一致?/p>
5.定义jBPM用户?br />
5.1在工作空间定义一个用户库Q?用来攄jBPM的库文g?br />
点击H口 --> 属性(Windows --> PreferencesQ?br />
选择Java --> 创徏路径 --> 用户cdQJava --> Build Path --> User LibrariesQ?br />
点击新徏QNewQ?br />
cd名字jBPM Libraries
点击dJARsQAdd JARs...Q?br />
扑ֈjBPM安装E序下的lib目录
选择lib下的所有jar文gq点?yn)L开QOpenQ?br />
选择jBPM Libraries作ؓ(f)入口
重新点击dJARsQAdd JARsQ?br />
在jBPM的安装程序的根目录下选择jbpm.jar文g
点击打开QOpenQ?br />
在jbpm.jar下选择源码附gQSource attachmentQ作为入?br />
点击~辑QEditQ?br />
在源码附件的配置QSource Attachment ConfigurationQ对话框中,点击目录QExternal Folder...Q?br />
到jBPM安装E序下的src目录
点击选择QChooseQ?br />
点击两次'定'QOkQ会(x)关闭所有对话框
6.试
6.1.现在开始新Z个例子测试下?br />
新徏一个java project,名test?br />
叛_test目工程,选择Properties→Java Build Path→Libraries→Add Library→User Lirary→jBPM Libraries(引入用户?.1建立的用户库jBPM Libraries)
如果没有执行5.1步骤,在Java Build Path→Libraries中选择Add External JARs把JBPM4.2/lib的包和JBPM4.2目录下的JBPM.jar加入到库中?/p>
新徏程定义文新建src/jbpm/Order.jpdl.xml,q个文g的内Ҏ(gu)自jbpm4.2jbpm-4.2\examples\src\org\jbpm\examples\services目录?br />
新徏csrc/jbpm/JbpmTest.java
从jbpm-4.2\src目录下找到jbpm.cfg.xmlQjbpm.hibernate.cfg.xmlQjbpm.mail.propertiesQjbpm.mail.templates.examples.xml复制到test/src目录下,
修改jbpm.hibernate.cfg.xml文g中的数据库连?使用Mysql)?br />
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpmdb</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
q行JbpmTest代码?/p>
如果出现[JDBCExceptionReporter] Cannot delete or update a parent row: a foreign key constraint fails (`jbpm`.`jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY (`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))
错误Q把hibernate.dialect改ؓ(f)<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
q行成功?按启动上一JBPM4.2安装的tomcat,讉Khttp://localhost:8080/jbpm-consoleQ登录JBPM控制収ͼ可以看到刚才发布的流E?br />
在数据库中也可看到jbpm4_deployment,jbpm4_deployprop,jbpm4_lob多了(jin)数据.
如果讉Khttp://localhost:8080/jbpm-console时出现登录失败,需要在发布后重新加载用户信息,q入jbpm-4.2\install,q行ant load.example.identities命o(h)。出现这个问题的原因是因为在jbpm.hibernate.cfg.xmlq个文g中配|问题,可以?<mapping resource="jbpm.identity.hbm.xml" /> q一句删除或注释掉,׃?x)出现发布时清空用户的问题?/p>
试代码:jbpmTest.rar