- 浏览: 333370 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
xing0029:
这样配置的话 事物不成功啊 还有什么地方需要注意的么 可以加我 ...
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器) -
mengqingyu:
liuxiaolu 写道jotm的我的没有成功,楼主能否帮助一 ...
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器) -
liuxiaolu:
jotm的我的没有成功,楼主能否帮助一下
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器) -
aptech406328627:
求解救,没弄好QQ:1053942353
Spring邮件发送(可带附件,模板,群发,异步发送等功能) -
ghpaas:
web可视化自定义表单推荐使用GForms开发平台(http: ...
在线表单设计器设计原理
集成JBPM到OA系统,并实现JbpmFacade接口
- 第一步:创建数据库表
* 拷贝依赖包:bsh.jar/jcr-1.0.jar/jbpm-identity.jar/jbpm-jpdl.jar
* 修改hibernate.cfg.xml,添加JBPM的映射配置,以及缓存属性的配置
- 拷贝JBPM中的hibernate配置文件到当前项目
- 修改build.xml文件,在"生成Hibernate配置文件"的任务中,添加一个属性:
mergecfgxml="${basedir}/hibernate_for_jbpm.cfg.xml"
* 因为JBPM中的User类与OA系统中的User类在名称上有冲突,所以需要修改OA
系统中的User类的auto-import="false",并更改查询User对象的HQL语句,加上
全路径的类名进行查找,可以参考UserManagerImpl类。
- 第二步:与spring集成
* 集成spring与JBPM,需要用到第三方的类库:spring-modules-0.8.zip
* 将其中的spring-modules-jbpm31.jar拷贝到web-inf/lib下面即可
* 集成JBPM与spring的方法是:将JbpmConfiguration对象交给spring来创建
* 所以,需要在spring配置文件里面配置JbpmConfiguration对象的创建
<bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
<property name="configuration" value="classpath:jbpm.cfg.xml"></property>
</bean>
* 这个时候,需要拷贝jbpm.cfg.xml到类路径中
(可以从jbpm-jpdl-3.2.GA\src\jpdl\org\jbpm目录中拷贝(default.jbpm.cfg.xml)文件,
并重命名即可)
- 第三步:如何实现业务逻辑类
* 用到jbpmConfiguration的时候,需要注入
* 当我们使用jbpmContext对象来操纵JBPM的时候,需要将JbpmContext内部的Hibernate session对象设置为当前的
hibernate session对象。
private JbpmContext getJbpmContext(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSession(getSession());
return context;
}
* 当我们使用jbpmContext操纵JBPM数据结束的时候,注意不要关闭jbpmContext!!
- 第一步:创建数据库表
* 拷贝依赖包:bsh.jar/jcr-1.0.jar/jbpm-identity.jar/jbpm-jpdl.jar
* 修改hibernate.cfg.xml,添加JBPM的映射配置,以及缓存属性的配置
- 拷贝JBPM中的hibernate配置文件到当前项目
- 修改build.xml文件,在"生成Hibernate配置文件"的任务中,添加一个属性:
mergecfgxml="${basedir}/hibernate_for_jbpm.cfg.xml"
* 因为JBPM中的User类与OA系统中的User类在名称上有冲突,所以需要修改OA
系统中的User类的auto-import="false",并更改查询User对象的HQL语句,加上
全路径的类名进行查找,可以参考UserManagerImpl类。
- 第二步:与spring集成
* 集成spring与JBPM,需要用到第三方的类库:spring-modules-0.8.zip
* 将其中的spring-modules-jbpm31.jar拷贝到web-inf/lib下面即可
* 集成JBPM与spring的方法是:将JbpmConfiguration对象交给spring来创建
* 所以,需要在spring配置文件里面配置JbpmConfiguration对象的创建
<bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
<property name="configuration" value="classpath:jbpm.cfg.xml"></property>
</bean>
* 这个时候,需要拷贝jbpm.cfg.xml到类路径中
(可以从jbpm-jpdl-3.2.GA\src\jpdl\org\jbpm目录中拷贝(default.jbpm.cfg.xml)文件,
并重命名即可)
- 第三步:如何实现业务逻辑类
* 用到jbpmConfiguration的时候,需要注入
* 当我们使用jbpmContext对象来操纵JBPM的时候,需要将JbpmContext内部的Hibernate session对象设置为当前的
hibernate session对象。
private JbpmContext getJbpmContext(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
context.setSession(getSession());
return context;
}
* 当我们使用jbpmContext操纵JBPM数据结束的时候,注意不要关闭jbpmContext!!
package com.bjsxt.oa.manager; import java.util.List; import com.bjsxt.oa.model.Document; public interface JbpmFacade { /** * 部署流程定义 * @param processDef 流程定义文件的数据 * @return 流程名称 */ public String deployProcessDefinition(byte[] processDef); /** * 删除流程定义 * @param processName 流程名称 */ public void delProcessDefinition(String processName); /** * 添加流程实例 * @param processName 流程实例对应的流程名称 * @param docId 公文ID * @return 流程实例 */ public long addProcessInstance(String processName,Document document); /** * 删除流程实例对象 * @param processInstanceId 删除流程实例对象 */ public void delProcessInstance(long processInstanceId); /** * 搜索某个用户手上的公文列表 * @param actorId 用户帐号 * @return List中的元素是docId */ public List searchMyTaskList(String actorId); /** * 查询下一步Transition列表 * @param processInstanceId 流程实例标识 * @param actorId 用户帐号 * @return List中的元素是Transition对象的名称 */ public List searchNextTransitions(long processInstanceId,String actorId); /** * 触发JBPM引擎流转到下一步 * @param processInstanceId 流程实例标识 * @param actorId 用户帐号 * @param transitionName transition Name * @return 流转之后,当前流程实例所对应的rootToken所指向的节点的名称 */ public String nextStep(long processInstanceId,String actorId,String transitionName); } package com.bjsxt.oa.manager.impl; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.def.Transition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.taskmgmt.exe.TaskInstance; import com.bjsxt.oa.manager.JbpmFacade; import com.bjsxt.oa.model.Document; public class JbpmFacadeImpl extends AbstractManager implements JbpmFacade { private JbpmConfiguration jbpmConfiguration; public long addProcessInstance(String processName, Document document) { JbpmContext context = getJbpmContext(); ProcessDefinition def = context.getGraphSession().findLatestProcessDefinition(processName); ProcessInstance instance = new ProcessInstance(def); instance.getContextInstance().setVariable("document", document.getId()); //将公文的标题放到流程实例变量中,以便在发送email的时候使用 instance.getContextInstance().setVariable("docTitle", document.getTitle()); //将公文的相关属性设置到流程实例变量中 Map props = document.getProperties(); if(props != null){ Set entries = props.entrySet(); for (Iterator iterator = entries.iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); String propertyName = (String)entry.getKey(); Object obj = document.getProperty(propertyName); //将变量放入流程实例中 instance.getContextInstance().setVariable(propertyName, obj); } } context.save(instance); return instance.getId(); } public void delProcessDefinition(String processName) { JbpmContext context = getJbpmContext(); List defs = context.getGraphSession().findAllProcessDefinitionVersions(processName); for (Iterator iterator = defs.iterator(); iterator.hasNext();) { ProcessDefinition def = (ProcessDefinition) iterator.next(); context.getGraphSession().deleteProcessDefinition(def); } } public void delProcessInstance(long processInstanceId) { JbpmContext context = getJbpmContext(); context.getGraphSession().deleteProcessInstance(processInstanceId); } public String deployProcessDefinition(byte[] processDef) { JbpmContext context = getJbpmContext(); ProcessDefinition def = ProcessDefinition.parseXmlInputStream( new ByteArrayInputStream(processDef) ); context.deployProcessDefinition(def); return def.getName(); } public String nextStep(long processInstanceId, String actorId, String transitionName) { JbpmContext context = getJbpmContext(); ProcessInstance instance = context.getProcessInstance(processInstanceId); //当前节点 String currentNodeName = instance.getRootToken().getNode().getName(); //起点的名称 String startNodeName = instance.getProcessDefinition().getStartState().getName(); //如果是在起点 if(startNodeName.equals(currentNodeName)){ if(transitionName == null){ instance.signal(); }else{ instance.signal(transitionName); } }else{ List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId); for (Iterator iterator = taskInstances.iterator(); iterator .hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); if(ti.getProcessInstance().getId() == processInstanceId){ if(transitionName == null){ ti.end(); }else{ ti.end(transitionName); } break; } } //查询actorId所属组的任务实例 List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId); for (Iterator iterator = pooledTaskInstances.iterator(); iterator .hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); if(ti.getProcessInstance().getId() == processInstanceId){ if(transitionName == null){ ti.end(); }else{ ti.end(transitionName); } break; } } } //返回转向之后的节点名称 return instance.getRootToken().getNode().getName(); } public List searchMyTaskList(String actorId) { JbpmContext context = getJbpmContext(); List docIds = new ArrayList(); //查询所有未结束的任务实例 List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId); for (Iterator iterator = taskInstances.iterator(); iterator.hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document"); docIds.add(docId); } //查询actorId所属组的任务实例 List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId); for (Iterator iterator = pooledTaskInstances.iterator(); iterator .hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); Integer docId = (Integer)ti.getProcessInstance().getContextInstance().getVariable("document"); docIds.add(docId); } return docIds; } public List searchNextTransitions(long processInstanceId, String actorId) { JbpmContext context = getJbpmContext(); ProcessInstance instance = context.getProcessInstance(processInstanceId); //当前节点 String currentNodeName = instance.getRootToken().getNode().getName(); //起点的名称 String startNodeName = instance.getProcessDefinition().getStartState().getName(); Collection transitions = null; //如果是在起点 if(startNodeName.equals(currentNodeName)){ transitions = instance.getRootToken().getAvailableTransitions(); }else{ List taskInstances = context.getTaskMgmtSession().findTaskInstances(actorId); for (Iterator iterator = taskInstances.iterator(); iterator .hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); if(ti.getProcessInstance().getId() == processInstanceId){ transitions = ti.getAvailableTransitions(); break; } } //查询actorId所属组的任务实例 List pooledTaskInstances = context.getTaskMgmtSession().findPooledTaskInstances(actorId); for (Iterator iterator = pooledTaskInstances.iterator(); iterator .hasNext();) { TaskInstance ti = (TaskInstance) iterator.next(); if(ti.getProcessInstance().getId() == processInstanceId){ transitions = ti.getAvailableTransitions(); break; } } } List transitionNames = new ArrayList(); //为了不把Transition对象直接暴露给OA系统,需要将其转换为名称列表 for (Iterator iterator = transitions.iterator(); iterator.hasNext();) { Transition transition = (Transition) iterator.next(); transitionNames.add(transition.getName()); } return transitionNames; } private JbpmContext getJbpmContext(){ JbpmContext context = jbpmConfiguration.createJbpmContext(); context.setSession(getSession()); return context; } public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) { this.jbpmConfiguration = jbpmConfiguration; } }
发表评论
-
基于Mybatis封装的增删改查实现通用自动化sql
2014-12-07 20:59 41821.基于map或javaBean的增删改查可实现不写dao接口 ... -
S2SH读取XML扩展点
2014-07-27 01:39 729由于struts2、hibernate通过默认配置文件不支持通 ... -
导出Word、Excel、PPT通用功能设计思路
2014-03-07 16:25 1846工作中经常 ... -
HttpClient抓取解析网站支持多种验证方式
2014-03-06 10:10 1432工作中遇到了抓取多个项目数据并且有多种验证方式包括Http标准 ... -
Tomcat架构分析及性能调优
2014-02-16 17:59 3224一.Tomcat容器层级结构 分为四个等级,由四个子容器组成 ... -
基于FLEX,MINA消息推送核心代码
2013-10-21 16:15 1730import java.util.List; impor ... -
(转载)拦截器与过滤器的区别
2013-05-10 15:36 1035拦截器与过滤器的区别 : 1.拦截器是基于java的反射机制 ... -
(转载)Struts中默认的拦截器栈
2013-05-10 13:19 5081Struts中默认的拦截器栈 ... -
Java并发模式
2013-04-02 12:58 2276在公司做培训时用到,顺便在这里做个总结。 1.生产者消费者模式 ... -
海量数据、高并发优化方案
2013-03-16 18:53 8553一.应用服务器负载均衡 1.链路负载均衡 通过DNS解析域 ... -
Lucene 详解
2013-03-01 11:10 15401.什么是全文检索 对于搜索,按被搜索的资源类 ... -
Spring JDBC批量操作
2013-01-20 02:51 271、使用JdbcTemplate进行批 ... -
Spring MVC 文件上传
2010-03-23 16:45 1124MultipartHttpServletRequest mul ... -
导出Excel(jxl)
2009-08-05 09:15 526Action代码: import java.io.IOExce ... -
Hibernate笔记(常用技术)
2009-07-21 17:13 2157一.对象关系映射基础 1.hibernate对象属性映射 ...
相关推荐
jbpm的实现流程图详细地展示了上述概念在实际应用中的交互和流转。上海亚太神通计算机有限公司作为实施方,可能在该流程图中详细描述了如何配置jbpm,包括流程定义的编写、流程实例的启动、任务的处理以及系统集成等...
3. **流程流转**:jbpm5使用条件、事件和过渡来控制流程的流转。当满足特定条件或触发特定事件时,流程会从当前节点流转到下一个节点。 4. **任务分配与处理**:jbpm5支持动态和静态的任务分配。静态分配是在流程...
这个源代码包可能包含了jbpm4的一个简单实现,用于公文流转,即电子化的工作审批流程。公文流转是企业管理中一个关键的环节,通过自动化的方式可以提高效率,减少错误。 jbpm4的核心特性包括: 1. **流程建模**:...
这个示例是关于如何在JBoss JBPM4平台上实现一个简单的请假流程,帮助开发者了解如何定义、执行和管理业务流程。 在JBoss JBPM4中,一个流程通常由一系列任务组成,这些任务可以由系统自动执行,也可以由人参与完成...
jBPM(Java Business Process Management)是一个开源的工作流和业务流程管理系统,主要用于实现企业的业务流程自动化。它基于Java技术,支持BPMN 2.0标准,提供了丰富的功能,包括流程设计、执行、监控以及集成能力...
这使得jBPM3不仅仅是一个流程管理工具,还能作为企业应用集成的一部分。 最后,jBPM3的社区活跃,拥有丰富的文档和示例,这对于初学者来说是一大福音。遇到问题时,查阅官方文档、社区论坛和Stack Overflow上的讨论...
3. **处理任务**:参与人员接收并完成任务实例,通过签收、处理、结束任务来推进流程流转。 4. **流程监控及管理**:记录并跟踪流程状态,用于优化流程效率,识别系统瓶颈,以及统计任务执行情况。 【使用JBPM的...
- **执行**:执行过程中,引擎处理流程流转、任务分配和数据交互。 - **监控**:通过监控工具查看流程实例的状态,进行问题排查和优化。 4. **jbpm集成**: - **Spring框架集成**:jbpm可以与Spring无缝结合,...
jbpm4的核心特性包括流程定义、执行、监控以及集成能力。在这个例子中,我们将会探讨如何将jbpm4与Web流程设计器整合,以便更直观地设计和管理业务流程。 ### 1. jbpm4简介 jbpm4是基于Java的,遵循JBoss社区的...
这个“jbpm+S2SH请假流程经典实现及源码”是一个实际的应用示例,它将jbpm的工作流引擎与S2SH框架集成,用于实现一个完整的请假流程管理。 首先,jbpm的核心功能包括流程建模、流程实例管理、任务管理和事件处理等...
jbpm4是一个开源的工作流程管理系统,它允许开发者在应用程序中实现业务流程自动化。Spring则是一个广泛使用的Java企业级应用开发框架,提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、数据访问等。 描述中...
3. **业务规则集成**:jbpm3可以与Drools规则引擎结合,实现业务逻辑与流程决策的分离。 四、jbpm3任务管理 1. **任务分配**:根据流程定义,jbpm3自动将任务分配给相应的角色或用户。 2. **任务处理**:用户可以...
【jbpm4.4-请假流程】是一个基于Java开发的流程引擎示例,主要用于演示如何在企业级应用中实现请假流程。jbPM是Java Business Process Management的缩写,它是一个开源的工作流和业务流程管理系统,提供了对BPMN 2.0...
综上所述,基于JBPM的公文流转系统不仅能够极大地提高办公效率,还能通过现代化的技术手段实现流程的自动化管理。通过合理的系统架构设计和技术选型,可以构建出既满足当前需求又具备良好扩展性的公文流转系统。随着...
这些文件使用特定的XML语法定义了各个任务、决策点和流程流转规则。 2. **任务节点**:在请假流程中,会有不同的任务节点,如“员工申请”、“经理审批”和“HR确认”。每个节点代表流程中的一个步骤,由不同的角色...
JBPM(Java Business Process Management)是一个开源的工作流和业务流程管理系统,它提供了全面的BPM解决方案,包括流程建模、执行、监控和集成。本视频教程主要围绕JPDL(JBPM Process Definition Language)和...
5. **流程流转**:审批过程中,根据审批结果(同意、拒绝),流程会沿着预设路径前进。如果审批通过,员工将获得假期;若被拒,则可能需要重新提交或调整申请。 6. **状态跟踪**:整个请假流程的状态变化会被记录,...
- **Hibernate支持**:通过Hibernate,JBPM3实现了与数据库的无缝集成,将数据管理与业务逻辑分离,提高了系统的可扩展性。 - **轻量级依赖**:JBPM3可以像Java类库一样轻松使用,也可以部署在J2EE集群环境中。 3...
在JBPM4.4Demo中,这些步骤被转化为可执行的工作流任务,通过定义流程图和配置业务规则,实现自动化流转。 4. **UserController.java** - 提到的`UserController.java`是项目中的关键组件,它包含初始化流程所需的...
- **命令行工具**:jbpm4.4可以通过SSH2与命令行工具结合,实现远程的流程部署、启动和管理,提供了一种安全的远程操作方式。 通过深入了解和实践jbpm4.4中的这些功能,你可以构建出强大的业务流程管理系统,有效...