通常我们在部署流程定义文件都需要借助jbpm的eclipse plugin,但是该插件有一个问题,就是每次打开一个流程文件非常的慢,而且一次只能deploy一个流程定义文件,如果有多个流程的话,就需要我们在插件中同时打开多个流程定义文件,这让人感觉非常麻烦.于是我们对流程部署进行了一下改进.
在插件中部署一个流程定义,其实就是将processdefinition.xml文件上传到一个指定的servlet,这个servlet就是org.jbpm.web.ProcessUploadServlet, 而对应的url地址是web.xml中定义的:
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>
org.jbpm.web.ProcessUploadServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
因此我们只需要自己写一个jsp页面,将要上传的文件提交到该url(http://myhost:myport/myapp/upload)即可.
通过参看ProcessUploadServlet的源代码,我们发现,它要求上传的文件必须是经过压缩的:
if (fileItem.getContentType().indexOf("application/x-zip-compressed") == -1) {
log.debug("Not a process archive");
return "Not a process archive";
}
try {
log.debug("Deploying process archive " + fileItem.getName());
ZipInputStream zipInputStream = new ZipInputStream(fileItem.getInputStream());
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
log.debug("Preparing to parse process archive");
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
log.debug("Created a processdefinition : " + processDefinition.getName());
jbpmContext.deployProcessDefinition(processDefinition);
zipInputStream.close();
return "Deployed archive " + processDefinition.getName() + " successfully";
} catch (IOException e) {
return "IOException";
}
也就是说,我们在上传流程定义文件之间必须将其压缩成zip文件(而且还不能嵌套其他的文件夹,zip里只能包含processdefinition.xml), 因此我们需要对其进行改造一下,能让我们直接上传流程定义xml文件:
private String handleRequest(HttpServletRequest request) {
//check if request is multipart content
log.debug("Handling upload request");
if (!FileUpload.isMultipartContent(request)) {
log.debug("Not a multipart request");
return "Not a multipart request";
}
String result = "";
try {
DiskFileUpload fileUpload = new DiskFileUpload();
List list = fileUpload.parseRequest(request);
log.debug("Upload from GPD");
for (Iterator it = list.iterator(); it.hasNext();) {
FileItem fileItem = (FileItem) it.next();
if (fileItem.getContentType() == null || fileItem.getContentType().indexOf("text/xml") == -1) {
log.debug("Not a process archive");
continue;
}
try {
log.debug("Deploying process archive " + fileItem.getName());
InputStream is = fileItem.getInputStream();
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
log.debug("Preparing to parse process archive");
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
log.debug("Created a processdefinition : " + processDefinition.getName());
jbpmContext.deployProcessDefinition(processDefinition);
is.close();
if (StringUtils.isNotEmpty(result)) {
result += ",";
}
result += processDefinition.getName();
} catch (IOException e) {
return "IOException";
}
}
} catch (FileUploadException e) {
e.printStackTrace();
return "FileUploadException";
}
if (StringUtils.isEmpty(result)) {
log.debug("No process file in the request");
return "No process file in the request";
}
return "Deployed process [" + result + "] successfully";
}
接下来是写jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Upload Process Definition Xml files</title>
<script src="upload.js" type="text/javascript"></script>
<style>
fieldset {
border: 1px solid #eee;
padding: 5px 10px;
margin: 0;
}
fieldset ul {
list-style: none;
margin: 0 0 1.5em 0;
padding: 0;
}
fieldset ul li {
list-style: none;
margin: 0 0 0.5em 0;
padding: 0;
}
</style>
</head>
<body>
<body>
<form action="<%=request.getContextPath()%>/upload" enctype="multipart/form-data"
id="process_form" method="post">
<fieldset>
<ul>
<li>
<label>
新增流程定义文件
</label>
<input type="file" id="process_upload" />
</li>
<li style="text-align: center">
<input class="submit" id="submit_button" name="commit"
type="submit" value="提交" />
</li>
</ul>
</fieldset>
</form>
<script type="text/javascript">
var multiple_upload_process_counter = 0;
multiple_upload_process($("process_upload"));
</script>
</body>
</html>
这里我借鉴了一下javaeye的application.js来添加多个上传文件:)
分享到:
相关推荐
综上所述,这个压缩包提供了一个便捷的方式,让用户能够快速进入业务流程开发环境,利用Eclipse 3.4的强大力量和JBPM的流程定义功能。同时,EditPlus 3的加入,进一步丰富了开发工具的选择,使得文本编辑更为灵活。...
"JBPM工作流实战_流程定义文件的上传处理视频 03"这一主题主要关注如何在实际操作中处理JBPM流程定义文件的上传,这在构建业务流程自动化系统时是非常关键的步骤。 首先,流程定义文件是JBPM工作流的核心组成部分,...
9. **异常处理和流程版本控制**:阐述如何处理流程执行过程中的异常,以及如何管理流程定义的多个版本,确保平滑的升级和回滚。 10. **API使用**:可能会介绍如何使用jBPM的Java API或REST API进行程序化地操作流程...
- **流程实例**:每个流程定义在运行时都会产生一个或多个实例,代表实际的流程执行过程。 - **工作项(Task)**:任务节点在流程实例中的具体表现,可能分配给个人或角色执行。 - **变量**:用于存储流程运行...
总之,jbpm流程监控的实现涉及到流程定义、实例启动、数据收集、界面展示、分析优化等多个环节。理解并掌握这些要点,将有助于我们更好地利用jbpm来管理和优化企业的业务流程。通过持续的监控和改进,企业能够确保其...
- **流程实例**:当流程定义被执行时,会产生一个或多个实例,每个实例代表一次流程运行。 - **任务**:流程中的各个活动,等待用户或系统执行。 - **节点**:流程图中的元素,如开始节点、结束节点、用户任务、...
综上所述,"我写的一个jbpm实例"是一个全面展示jbpm功能和SSH框架集成的应用案例,涵盖了流程设计、部署、执行、监控等多个方面。通过学习这个实例,读者可以加深对jbpm的理解,为实际项目开发提供参考。
- **流程实例**: 部署的模型可以触发生成流程实例,每个实例代表一次流程执行的过程。 - **监控与跟踪**: JBPM提供了监控工具,可以追踪流程实例的状态,分析性能,帮助优化流程。 综上所述,【JBPM Web流程设计器...
JBPM的内核模型包括工作流引擎、流程定义、流程实例等核心元素,而其内核架构则涉及流程加载、启动、任务处理和流程监控等多个层面。 【基本处理步骤】 1. **加载(发布)流程定义**:通过Eclipse Designer或其他...
- **任务(Task)**:流程中的一个步骤,可以分配给一个或多个参与者执行。 - **节点(Node)**:流程图中的活动,如开始节点、结束节点、用户任务、服务任务等。 - **变量(Variable)**:存储流程运行时数据的...
4. 版本管理:每个流程可以有多个版本,新版本发布时不会影响已运行的旧版本实例。通过版本管理,可以灵活地升级和回滚流程。 5. 部署与激活:发布流程后,需要将其部署到特定的环境,如服务器或集群。部署成功后,...
解压缩后,你会看到一个包含多个jar文件的目录结构。 3. **集成到项目**:将必要的jar文件添加到你的Java项目类路径中。这可能包括jbpm-core.jar、持久化相关的jar、以及你需要的模块jar。 4. **配置持久化**:...
jBPM提供了一个图形化的工作流设计器,使得开发者可以通过拖拽的方式来创建流程定义,极大地简化了流程设计过程。此外,jBPM还提供了命令行工具和API,方便开发者进行流程部署、实例管理和监控。 **四、jBPM集成** ...
jbpm4.4是JBoss Business Process Management Suite的第4.4版本,它是一个开源的工作流和业务流程管理系统,用于构建、部署和管理业务流程。本教程将深入探讨jbpm4.4中的核心功能,包括流程运转、驳回、分配组任务...
在请假流程中,我们需要定义一个流程模型,包括请假申请、审批等节点。这些节点可以用图形化工具如jBPM Designer进行绘制,然后导出为XML流程定义文件(.bpmn或.bpmn2)。 3. **请假实体类** 创建请假申请的实体类...
总之,【JBPM案例详解(一)】涵盖了JBPM的基本概念、流程设计、部署执行、监控和系统集成等多个方面,旨在通过一个具体的业务场景,使读者深入理解和应用JBPM这一强大的工作流管理工具。通过学习和实践,读者不仅能...
4. **支持多种流程定义语言**:除了默认支持的jPDL、WS-BPEL和Seam框架的Pageflow外,jBPM还计划支持更多流程定义语言,以适应不同的业务场景需求。 5. **严格的流程版本控制**:jBPM提供了严格的版本控制机制,...
JBPM4提供了多个服务接口,每个接口负责特定的流程管理功能,包括: 1. **RepositoryService**:流程资源服务接口,用于管理流程定义的生命周期,包括部署、查询和删除流程定义。 2. **ExecutionService**:流程...
总结来说,jBPM-jPDL的学习涵盖了流程建模、控制逻辑、数据库集成等多个方面。通过深入理解jPDL和实践项目配置,开发者可以有效地利用jBPM实现业务流程自动化,提高工作效率,同时保持流程的灵活性和可扩展性。这篇...
总之,jbPM作为一个全面的业务流程管理框架,不仅提供了直观的流程定义方式,还具备优秀的数据库管理和灵活的API,是开发高效工作流应用的理想选择。通过深入理解和熟练运用jbPM,开发者可以构建出更加智能化和自动...