`

jpbm4入门实践之web请假流程。

 
阅读更多

jbpm4对与想学习工作流的coder来说,也不会陌生了,基本的介绍我就不多说了,这里有一篇我转载的jbpm4的开发环境配置的文章,没配置好的童鞋可以依照配置一下。好了开始进入正题。

jbpm4在平时使用中需要用的概念大体总结如下:

1、工作流的发布和删除

processEngine:流程引擎,直接通过Configuration.getProcessEngine()获得,是一个静态的方法。

repositoryService:管理流程定义,部署流程的一个类,通过processEngine.getRepositoryService()获得,

可以通过repositoryService.createDeployment().addResourceFromClasspath("leave.jpdl.xml").deploy()来直接部署一个jpdl的流程定义文件。

可以通过repositoryService.createDeployment().addResourcesFromZipInputStream(zis),将一个压缩包的流进行部署。

可以通过createProcessDefinitionQuery().list()来查询当前已经加载的流程定义列表。

可以通过createDeploymentQuery().list()来查询已经部署的流程列表。

可以通过deleteDeployment()或者deleteDeploymentCascade()来删除已经部署的流程,带Cascade的函数会级联删除流程下的子流程。

在请假流程项目中的应用代码如下:

ProcessEngine processEngine = Configuration.getProcessEngine();
	RepositoryService repositoryService = processEngine
			.getRepositoryService();


	//repositoryService.createDeployment().addResourceFromClasspath("leave.jpdl.xml").deploy();
	ZipInputStream zis = new ZipInputStream(this.getClass()
			.getResourceAsStream("/leave.zip"));
	repositoryService.createDeployment()
			.addResourcesFromZipInputStream(zis).deploy();
解释一下:这里加载的leave.zip是指 编译完成leave.jpdl.xml之后生成了相应的leave.png时候将这两个文件打包之后的zip,至于这样部署的目的是能够通过里面打包的lave.png文件获得对应的流程图,一边在项目后面查看当前流程所处进度时候使用。

2、流程实例的启动、删除、查看进度。

ExecutionService:通过processEngine.getExecutionService(),这个类是负责管理流程运行相关事宜的,

可以通过startProcessInstanceById()来启动一个流程,这个id是通过部署时createProcessDefinitionQuery().list()来获得。

可以通过endProcessInstance来结束一个流程实例,结束之后查看该流程实例的流程图会显示结束状态。

可以通过deleteProcessInstance和deleteProcessInstanceCascade,删除一个流程实例,删除操作的历史记录会jbpm数据库里面可以查看到。

可以通过executionService.createProcessInstanceQuery().list()来获得一个流程实例的list

ProcessInstance:可以通过上面的查询获得,

可以通过getId()获得流程实例的id

可以通过findActiveActivityNames()来获得当前处于激活状态的节点,返回的是一个set集合,因为一个流程可能需要同时需要三个或任意个节点的全部通过才会继续想下走。

可以通过getState()获得当前流程节点的一个状态

STATE_ACTIVE_ROOT:表示在流程图中处于一个“单线(非并发)”的流程节点。

STATE_ACTIVE_CONCURRENT:表示在流程图中处于一个并发的流程节点。

STATE_INACTIVE_CONCURRENT_ROOT:表示在流程图中,当前节点是并发节点的父节点。

STATE_INACTIVE_SCOPE:表示在流程图中,当前节点是一个域流向的父节点(这句话翻译的有点生硬,我也不是很理解,原文是:parent of a scoped execution)。

STATE_INACTIVE_JOIN:表示当前节点会在其他并发节点到达前一直等待。

STATE_SUSPENDED:表示当前节点临时挂起。

STATE_ASYNC:表示当前流程正在执行一个异步的延续,意思就是当前节点已经脱离主流程正在完成一个独立的任务。STATE_ENDED:流程结束。

在请假流程项目中的应用代码如下:

//启动
ProcessEngine processEngine = Configuration.getProcessEngine();
	ExecutionService executionService = processEngine
			.getExecutionService();
	Map map = new HashMap();
	map.put("owner", session.getAttribute("username"));
	executionService.startProcessInstanceById(request
			.getParameter("id"), map);
//删除
ProcessEngine processEngine = Configuration.getProcessEngine();
	RepositoryService repositoryService = processEngine.getRepositoryService();
	repositoryService.deleteDeploymentCascade(request.getParameter("id"));
//查看流程进度
1.显示整张流程图
<img src="pic.jsp?id=<%=id %>" style="position:absolute;left:0px;top:0px;">
//pic.jsp中的内容。就是将lave。png输出到页面
ProcessEngine processEngine = Configuration.getProcessEngine();
	RepositoryService repositoryService = processEngine
			.getRepositoryService();
	ExecutionService executionService = processEngine
			.getExecutionService();
	String id = request.getParameter("id");
	ProcessInstance processInstance = executionService
			.findProcessInstanceById(id);
	String processDefinitionId = processInstance
			.getProcessDefinitionId();
	ProcessDefinition processDefinition = repositoryService
			.createProcessDefinitionQuery().processDefinitionId(
					processDefinitionId).uniqueResult();
	InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),"leave.png");
	byte[] b = new byte[1024];
	int len = -1;
	while ((len = inputStream.read(b, 0, 1024)) != -1) {
		response.getOutputStream().write(b, 0, len);
	}
2.标出当前流程进度
<div style="position:absolute;border:1px solid red;left:<%=ac.getX()%>px;top:<%=ac.getY()%>px;width:<%=ac.getWidth()%>px;height:<%=ac.getHeight()%>px;"></div>
String id = request.getParameter("id");
	ProcessEngine processEngine = Configuration.getProcessEngine();
	RepositoryService repositoryService = processEngine.getRepositoryService();
	ExecutionService executionService = processEngine.getExecutionService();
	ProcessInstance processInstance = executionService.findProcessInstanceById(id);
	Set<String> activityNames = processInstance.findActiveActivityNames();
	//这个ac包含了当前节点在流程图中的坐标和高宽。通过上面的div在leave。png标注出来
	ActivityCoordinates ac = repositoryService.getActivityCoordinates(processInstance.getProcessDefinitionId(),activityNames.iterator().next());

3、查看任务、完成任务。

taskService:通过processEngine.getTaskService()获得,这个类负责专门管理任务的,因为一个流程图中的每个节点都是一个任务,在规划流程图时,你可以给买个任务节点分配一定的人来进行处理这个节点的事物。

通过findPersonalTasks()方法获得一个tasklist,该方法需要一个代表用户名的string参数,这个方法是检索的我们在流程图中配置的每个节点的分配人。

Task: 通过tasklist获得

通过getId()和getName()获得任务的的id和名称。

可以通过获得getFormResourceName()获得当前任务节点在流程图中定义的form地址。

可以通过taskService.completeTask(taskId, map)来完成一个任务,使流程继续执行,taskid就是任务id,map里面放置一些参数是你定义当前流程的表达式所需要的参数

在请假流程项目中的应用代码如下:

1、查看任务 这里是经理审批请假申请的代码
ProcessEngine processEngine = Configuration.getProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = request.getParameter("id");
Task task = taskService.getTask(taskId);
//这里获取到task对象之后可以使用getVariable()方法获得task中保存的变量。
<legend>经理审核</legend>
    <form action="submit_manager.jsp" method="post">
      <input type="hidden" name="taskId" value="${param.id}">
      申请人:<%=taskService.getVariable(taskId, "owner") %><br/>
  请假时间:<%=taskService.getVariable(taskId, "day") %><br/>
    请假原因:<%=taskService.getVariable(taskId, "reason") %><br/>
    <input name="result" type="submit" value="批准"/><input name="result" type="submit" value="驳回"/>
2、完成任务,经理点击批准的代码
//这里只要把当前任务节点需要的参数都放进map里面传递给task就可以。
ProcessEngine processEngine = Configuration.getProcessEngine();
TaskService taskService = processEngine.getTaskService();

String taskId = request.getParameter("taskId");
String result = request.getParameter("result");
result = new String(result.getBytes("ISO-8859-1"), "UTF-8");
taskService.completeTask(taskId, result);

注:在编写jpdl.xml流程图文件时,可视界面绘制完之后,还需要在source界面每个task中手动添加一个form=“xxx.jsp”,这个jsp就对应着当前task的表单地址。这个属性在可视界面是无法操作的,这里在提醒大家一下,当你在source界面编辑完属性之后,不要在可视界面做修改了,不然你手动添加的属性,例如:form就会全部消失。请假流程里面的经理审批表达式是:#{day > 3 ? '老板审批' : '结束'}, 你就需要把day这个参数放进map里面。


这篇博客不想在继续了,因为今天和经理汇报了调研jbpm4的结果后,感觉不是很满意,bug很多,我简单列举几个:

现有的流程绘制查询gpdbug很多(不包括gbk的项目),乱码问题和编辑玩可视化界面 source界面代码重新生成的问题。

不是生成一些代码,很多重复性代码都需要收工来写,

结合现有项目的用户系统很不方便,

已经停止更新了,很多包会和先有项目的包有版本冲突

流程定义多样化不够完善。

毕竟是一个夭折的项目,夭折可能不合适,更像一个中途改嫁的妇人。。


开始研究jbpm5,我的资源里有下载jbpm4的小例子:上半部压缩包下半部压缩包


分享到:
评论

相关推荐

    ssh2+jbpm4.4 完整请假流程

    自从前些日子发布了如何整合JBPM4.4+ssh2后,有些朋友问我有没有一个完整一点的实例,我看过贩卖你的jbpm的教程,我就参考那个请假的实例把它改装成ssh2版的吧。顺便也加入了模拟不同的角色登陆后能接到不同的待办...

    流程控制应用JPBM

    标题中的“流程控制应用JPBM”指的是Java Process Business Modeler,它是一种用于设计、执行和管理业务流程的技术。JPBM通常结合Java技术和企业级服务来实现业务流程的自动化。在这个场景中,我们可以推断出讨论的...

    jbpm4 开发手册

    6. **jpbm4安装手册**:jbpm4的安装手册详细指导了如何设置开发环境、下载和配置jbpm4,以及启动和测试基本流程,是新用户入门的重要参考资料。 7. **jpbm学习笔记**:这些笔记可能包含开发者在实践过程中的经验...

    JPBM实战经验以及相关参考文档

    **正文** JPBM,全称为Java Business Process Management,是一款开源的工作流引擎,它主要用于管理和执行业务流程。...记住,实践是检验真理的唯一标准,理论知识结合实际操作,将使你成为JPBM领域的专家。

    深入浅出JPBM 第9章相关源代码

    10. **实战案例**:《深入浅出JPBM》的源代码可能包含了一些实际的业务流程示例,如员工请假审批、订单处理等,帮助读者了解如何将理论知识应用到实际项目中。 通过深入学习和分析这些源代码,读者可以不仅理解JPBM...

    JPBM的学习文档,学习工作流的朋友可以看看

    《JBPM工作流开发指南》是一份详尽的文档,旨在帮助开发者理解和使用JPBM这一工作流管理系统。JPBM(JBoss Business Process Management ...通过深入学习和实践,开发者能够有效地利用JPBM提升工作效率,优化业务流程。

    jpbm流程图示例,js版本的流程图

    在本案例中,我们关注的是"jpbm流程图示例,js版本的流程图",这意味着我们将讨论如何使用JavaScript实现流程图的绘制和交互功能。 流程图通常由一系列图形节点(如开始、结束、决策、活动等)和连接这些节点的线条...

    JPBM 开发手册 开发指南

    《JPBM 开发手册 开发指南》是一份专注于企业级业务流程管理(Business Process Management,简称BPM)的综合指导文档,特别针对JBoss、jBPM和jPDL技术进行了深入阐述。这份资料旨在帮助开发者高效地利用这些工具...

    jpbm学习资料个人总结

    它被设计用于处理业务流程自动化,支持复杂的业务流程管理和执行。jBPM并不局限于与JBoss应用服务器一起使用,它可以与其他Java应用服务器,如Tomcat,协同工作。由于其开源性质,jBPM的设计和功能在不断进化,因此...

    JPBM实例报销和采购源代码

    总的来说,JPBM实例报销和采购源代码是一个很好的学习平台,通过实践你可以掌握如何利用JPBM进行业务流程的建模和管理,提升你的Java BPM开发能力。在深入研究源代码的过程中,不仅要注意流程定义的逻辑,还要关注...

    myeclipse中安装jpbm插件

    - **实践应用**:结合具体项目需求,尝试使用JBPM设计和实现业务流程,不断积累实践经验。 #### 结语 通过上述步骤,您应该能够成功地在MyEclipse中安装并使用JBPM插件。JBPM插件的强大功能可以帮助开发者更高效地...

    jpbm公文流转实现

    在"jpbm"系统中,流转过程应该是可配置的,可以根据企业的具体业务流程进行定制。例如,某些公文可能需要经过部门主管的初审,然后再提交给高层领导终审;而另一些公文则可能直接由总经理审批。此外,公文流转过程中...

    jpbm eclipse插件

    `jpbm eclipse插件`是一个专为Eclipse集成开发环境设计的扩展工具,主要用于提升开发者在处理业务流程建模(Business Process Modeling)时的效率和体验。版本号为3.0.13,表明这是一个经过多次迭代和优化的成熟产品...

    深入浅出JPBM 第7章源代码

    【深入浅出JPBM 第7章源代码】是关于企业级业务流程管理(Business Process Management,简称BPM)系统开发的实践教程。本章节聚焦于报销与采购流程的实现,通过提供完整的工程源代码,帮助读者更直观地理解JPBM在...

    JPBM.zip_jbpm_jpbm

    "JPBM╢}╡o½ⁿ½n.pdf" 这个文件可能是JBPM 4.0开发手册的PDF版,其中可能涵盖了以上所有知识点的详细讲解,包括流程设计实例、代码示例、配置教程以及常见问题解答等内容。对于想要深入学习和使用JBPM 4.0的...

    JBPM4.4 入门小例子

    JPBM4.4入门小例子,适合刚开始准备学工作流的筒子们。。

    jpbm文件流jar包

    jpbm文件流依赖库,jbpm-jpdl-3.2.GA\jbpm-jpdl.jar

    jpbm工作流例子,已经搭建好,部署就可以

    4. **事件驱动**:jbpm支持事件驱动的流程,可以根据特定的事件触发流程的下一步。 5. **规则引擎集成**:jbpm集成了Drools规则引擎,可以将业务规则和流程结合,实现规则驱动的流程决策。 6. **监控和审计**:...

Global site tag (gtag.js) - Google Analytics