BPM业务流程管理BPM详解工作流管理系统_第1页
BPM业务流程管理BPM详解工作流管理系统_第2页
BPM业务流程管理BPM详解工作流管理系统_第3页
BPM业务流程管理BPM详解工作流管理系统_第4页
BPM业务流程管理BPM详解工作流管理系统_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

BPM业务流程管理BPM详解工作流管理系统J2EE工作流管理系统jBPM详解(一)一、jBPM入门简介概述工作流业务流程管理技术是基于SOA在软件开发和业务两个层次受益:1、方便开发工作流管理系统能够简化企业级软件开发甚至维护。◆降低开发风险-通过使用状态和动作这样的术语,业务分析师和开发人员使用同一种语言交谈。这样开发人员就不必将用户需求转化成软件设计了。◆实现的集中统一-业务流程经常变化,使用工作流系统的最大好处是:业务流程的实现代码,不再是散落在各种各样的系统中。◆加快应用开发-你的软件不用再关注流程的参与者,开发起来更快,代码更容易维护。2、业务流程管理(BPM)◆提高效率-许多流程在自动化过程中会去除一些不必要的步骤较好的流程控制-通过标准的工作方法和跟踪审计,提高了业务流程的管理◆改进客户服务-因为流程的一致性,提高了对客户响应的可预见性◆灵活-跨越流程的软件控制,使流程可以按照业务的需要重新设计。◆业务流程改进-对流程的关注,使它们趋向于流畅和简单1.目前解决华研今后新项目中复杂业务流程如何使用工作流引擎技术进行实现的问题。2.上升到面向服务体系架构,实现各个服务之间的业务流程。jBPMJavaBusinessProcessManagementJ2EE的轻量级工作流管理系统。jBPM是公开源代码项目,它使用要遵循ApacheLicense.jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBossJBossjBPM.随着jBPM加入JBossjBPMJBossjBPM只有最小的倚赖性,它可以很容易的作为java库来使用。当然它也可以用在访问量很大的J2EE群应用服务器环境中。JBossjBPM可以同任何数据库配置可以部署在任何应用服务器上。jBPMWfMCXPDL,BPML,ebXML,BPEL4WS等,而是采用了它自己定义的JBossjBPMProcessdefinitionlanguage(jPdl)。jPdl认为一个商务流程可以被看作是一个UML状态图。jPdl就是详细定义了这个状态图的每个部分,如起始、结束状态,状态之间的转换等。jBPM的另一个特色是它使用Hibernate来管理它的数据库。Hibernate是目前JavaHibernatejBPM将数据的管理选型评估报告)。本文档主要是工作流研究小组关于开源工作流引擎jbpm的研究成果总结。内容包括工作流研究场景的介绍、jbpm的环境配置,并包括以下六个研究主题:◆JBPM同开发如何结合,又如何保持独立性;对应用系统的设计实现有什么样的制约◆用户/角色如何同应用系统结合,变化又如何处理◆流程中每个活动,如何动态指定执行者◆类似传阅功能如何实现◆子流程如何实现◆流程执行步骤耗时阀值和自动提醒设置◆jBPM当前版本的稳定性评估术语、定义和缩略语应用场景房的过程是一个非常典型的工作流场景。我们将这一过程提取出来,作为jbpm技术研究的场景。在购房过程中,会有以下人员参与。客户:购房的主体销售人员:在购房过程中指导看房,购房。销售经理:确定认购信息。财务人员:收取定金。客服人员:打印收据,打印客户认购书。客户购房的过程可以描述如下。◆客户来到售楼中心,销售人员进行接待。◆客户向销售人员提供预先申请的服务号。◆销售人员确认服务号是否有效,如果无效现场给出一个新的服务号。◆销售人员引导客户选房。◆客户确定户型,房号。◆销售人员录入客户认购资料。◆销售人员确认认购资料填写完整。◆销售人员将认购资料提交给销售经理审批。◆确定是否可以获得优惠,如果客户是一次交清房款,获得0.1%优惠。◆交上级经理审批。◆销售人员引导客户到财务处交纳定金。◆交纳定金后,客服人员打印收据。◆客服人员打印认购书。程作一些删改。客户认购的流程改为:◆客户确定购房,销售人员录入认购资料。◆提交认购资料,必须保证录入资料的完整性。◆提交审核,按总金额进行分类审核。如果金额小于50万销售经理审核即可,大于50万还要上级经理两人同时审核通过。◆审批完成,客户到财务处交纳定金。◆客服人员为客户打印收据,打印认购书,认购完成。上面的流程中一些异常情况(流程中的一些分支)在交纳定金之前可以随时放弃认购。号。通用的标准规范jBPM是个功能全面的WorkflowEngine,融合了4大功能:Workflow,BPM,BPELPageFlowBPELjbossHibernate定义的自定义标准jpdl,不支持目前公开的工作流(业务流程)标准,如:◆JCP◆JSR208JavaBusinessIntegration◆JSR207ProcessDefinitionforJava◆OASIS◆WS-BPEL◆WorkflowManagementCoalition(WFMC)◆WFMCXPDL◆BusinessProcessManagementInitiative(BPMI)◆BPMN◆ObjectManagementGroup(OMG)◆StateChartXML(SCXML)处理测试阶段的JBossjBPMBPEL扩展准备支持BPEL1.1标准(非标准组织通过的标准)。技术方案由于公司采取的架构是ejb3+tapestry4架构,所以我们的场景实现架构也是基tapestry4+ejb3+jbpm3.2,我们所采取的jbpm版本是3.2jbpmjboss作为我们的web服务器开发环境这里我们是采用eclipse3.2开发工具进行开发,Tapestry4+ejb3的开发环境配置和以往的项目配置基本保持一致,这里就不再进行详细介绍,关键就是jbpm3.2的配置方法。我们从jBoss官方网站()上下载jbpm-jpdl-suite-3.2.GA.zip,最新的版本是3.2.GA,这个包括:◆jbpm-server,预先配置的jboss应用服务器.◆jbpm-designer,jBPM流程图形化设计器的eclipse插件.◆jbpm-db,jBPM数据库兼容包(参看下面).◆jbpm,核心jbpm组件包括库和用户手册.◆jbpm-bpel,JBossjBPMBPEL扩展参考.预配置的JBoss应用服务器有下列安装组件:核心jBPM组件,打包作为JBoss服务档案一个包括所有jBPM表格的完整数据库:默认的hypersonic数据库包含所有的jBPM表格和已经定义的流程.jBPM控制台web应用程序这个可以用来为jBPM管理员.jBPM调度程序所有定时器的执行.调度程序在新手工具箱里配置成了一个servlet.这个Servlet会为产生一个线程来监视每个定时器的执行.一个流程例子已经发布进了jBPM数据库,关于jbpm-jpdl-suite-3.2套件包的具体介绍,可以参考JBossjBPMCookbook手册。JBossjBPM是一个Java库.因此,它可以用在任何java环境比如web应用程序,Swing应用程序,EJB,WebService等等,JBossjBPM核心组件被打包成一个简单的Java库文件.它依赖你所使用的功能性,库jbpm-jpdl.jar及一些相关的第三方的库比如.hibernate3.2,dom4j等等在我们实现场景中。要使用jbpm,我们首先需要将jbpm3.2的包导入我们的项jbpm3.2的主要包括两个包jbpm-jpdl.jar和jbpm-identity.jarjbpm-jpdl.jar是jbpm的核心包,jbpm-identity.jar则是jbpm自带的用户角色权限管理包。我们将这两个包导入我们的项目中。(具体可参考jbpm的用户手册)在jbpm中,流程的定义主要是编写在xml文件中的,我们需要将具体的业务流程在xml名为“processes”,在该目录我们可以保存流程定义xml文件。JBossjBPM包括一个图形化的流程设计工具.这个设计器是用来创作商业流程的,该图形设计器是一个Eclipse业务分析员和技术开发人员.这样就可以在业务流程建模和实际执行之间平滑转来设计。该插件位于jbpm-jpdl-suite-3.2.GA.zip中,插件的安装方法可以参考elipse插件的安装方法。安装完毕后,我们下面可以通过该插件新建流程设计文件。步骤如下:1、在processes目录中右建选择“New”—》“other”2、选择“ProcessDefinition”,点击“Next”输入Processname务来设计工作流流程文件。Jbpm本身包含很多自己的jbpm数据库表,jBPM内部使用hibernate来管理它的HibernatejBPMjBPM移植在不同的数据库.操作都保存在jbpm数据表中,通过调用jbpm提供的接口,我们可以对jBPM数据库进行存储,Mysql5.0“config.files”立hibernate.cfg.xml文件:hibernate.cfg.xml<?xmlversion='1.0'encoding='utf-8'?><!DOCTYPEhibernate-configurationPUBLIC"-//Hibernate/HibernateConfigurationDTD3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!--hibernatedialect--><!--propertyname="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property--><propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!--JDBCconnectionproperties(begin)===<propertyname="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property><propertyname="hibernate.connection.url">jdbc:hsqldb:mem:jbpm</property><propertyname="hibernate.connection.username">sa</property><propertyname="hibernate.connection.password"></property>====JDBCconnectionproperties(end)--><!--JDBCconnectionforMySQLdatabase--><propertyname="connection.driver_class">com.mysql.jdbc.Driver</property><propertyname="connection.url">jdbc:mysql://localhost/myjbpm</property><propertyname="connection.username">root</property><propertyname="connection.password">1234</property><!--JDBCconnectionpool(usethebuilt-in)--><propertyname="connection.pool_size">1</property><propertyname="vider_class">org.hibernate.cache.HashtableCacheProvider</property><!--usedatasource--><!--DataSourceproperties(begin)<propertyname="hibernate.connection.datasource">java:comp/env/JbpmDS</property>DataSourceproperties(end)--><!--Dropandre-createthedatabaseschemaonstartup--><propertyname="hbm2ddl.auto">create</property><!--JTAtransactionproperties(begin)===<propertyname="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property><propertyname="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>====JTAtransactionproperties(end)--><!--CMTtransactionproperties(begin)===<propertyname="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property><propertyname="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>====CMTtransactionproperties(end)--><!--loggingproperties(begin)===<propertyname="hibernate.show_sql">true</property><propertyname="hibernate.format_sql">true</property><propertyname="hibernate.use_sql_comments">true</property>====loggingproperties(end)--><!--############################################--><!--#mappingfileswithexternaldependencies#--><!--############################################--><!--followingmappingfilehasadependendyon--><!--'bsh-{version}.jar'.--><!--uncommentthisifyoudon'thavebshonyour--><!--classpath.youwon'tbeabletousethe--><!--scriptelementinprocessdefinitionfiles--><mappingresource="org/jbpm/graph/action/Script.hbm.xml"/><!--followingmappingfileshaveadependendyon--><!--'jbpm-identity.jar',mappingfiles--><!--ofthepluggablejbpmidentitycomponent.--><!--Uncommentthefollowing3linesifyou--><!--wanttousethejBPMidentitymgmgt--><!--component.--><!--identitymappings(begin)--><mappingresource="org/jbpm/identity/User.hbm.xml"/><mappingresource="org/jbpm/identity/Group.hbm.xml"/><mappingresource="org/jbpm/identity/Membership.hbm.xml"/><!--identitymappings(end)--><!--followingmappingfileshaveadependendyon--><!--theJCRAPI--><!--jcrmappings(begin)===<mappingresource="org/jbpm/context/exe/variableinstanc/JcrNodeInstance.hbm.xml"/>====jcrmappings(end)--><!--######################--><!--#jbpmmappingfiles#--><!--######################--><!--hqlqueriesandtypedefs--><mappingresource="org/jbpm/db/hibernate.queries.hbm.xml"/><!--graph.defmappingfiles--><mappingresource="org/jbpm/graph/def/ProcessDefinition.hbm.xml"/><mappingresource="org/jbpm/graph/def/Node.hbm.xml"/><mappingresource="org/jbpm/graph/def/Transition.hbm.xml"/><mappingresource="org/jbpm/graph/def/Event.hbm.xml"/><mappingresource="org/jbpm/graph/def/Action.hbm.xml"/><mappingresource="org/jbpm/graph/def/SuperState.hbm.xml"/><mappingresource="org/jbpm/graph/def/ExceptionHandler.hbm.xml"/><mappingresource="org/jbpm/instantiation/Delegation.hbm.xml"/><!--graph.nodemappingfiles--><mappingresource="org/jbpm/graph/node/StartState.hbm.xml"/><mappingresource="org/jbpm/graph/node/EndState.hbm.xml"/><mappingresource="org/jbpm/graph/node/ProcessState.hbm.xml"/><mappingresource="org/jbpm/graph/node/Decision.hbm.xml"/><mappingresource="org/jbpm/graph/node/Fork.hbm.xml"/><mappingresource="org/jbpm/graph/node/Join.hbm.xml"/><mappingresource="org/jbpm/graph/node/State.hbm.xml"/><mappingresource="org/jbpm/graph/node/TaskNode.hbm.xml"/><!--context.defmappingfiles--><mappingresource="org/jbpm/context/def/ContextDefinition.hbm.xml"/><mappingresource="org/jbpm/context/def/VariableAccess.hbm.xml"/><!--taskmgmt.defmappingfiles--><mappingresource="org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/def/Swimlane.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/def/Task.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/def/TaskController.hbm.xml"/><!--module.defmappingfiles--><mappingresource="org/jbpm/module/def/ModuleDefinition.hbm.xml"/><!--bytesmappingfiles--><mappingresource="org/jbpm/bytes/ByteArray.hbm.xml"/><!--file.defmappingfiles--><mappingresource="org/jbpm/file/def/FileDefinition.hbm.xml"/><!--scheduler.defmappingfiles--><mappingresource="org/jbpm/scheduler/def/CreateTimerAction.hbm.xml"/><mappingresource="org/jbpm/scheduler/def/CancelTimerAction.hbm.xml"/><!--graph.exemappingfiles--><mappingresource="org/jbpm/graph/exe/Comment.hbm.xml"/><mappingresource="org/jbpm/graph/exe/ProcessInstance.hbm.xml"/><mappingresource="org/jbpm/graph/exe/Token.hbm.xml"/><mappingresource="org/jbpm/graph/exe/RuntimeAction.hbm.xml"/><!--module.exemappingfiles--><mappingresource="org/jbpm/module/exe/ModuleInstance.hbm.xml"/><!--context.exemappingfiles--><mappingresource="org/jbpm/context/exe/ContextInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/TokenVariableMap.hbm.xml"/><mappingresource="org/jbpm/context/exe/VariableInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml"/><mappingresource="org/jbpm/context/exe/variableinstance/StringInstance.hbm.xml"/><!--jobmappingfiles--><mappingresource="org/jbpm/job/Job.hbm.xml"/><mappingresource="org/jbpm/job/Timer.hbm.xml"/><mappingresource="org/jbpm/job/ExecuteNodeJob.hbm.xml"/><mappingresource="org/jbpm/job/ExecuteActionJob.hbm.xml"/><!--taskmgmt.exemappingfiles--><mappingresource="org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/exe/PooledActor.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml"/><!--loggingmappingfiles--><mappingresource="org/jbpm/logging/log/ProcessLog.hbm.xml"/><mappingresource="org/jbpm/logging/log/MessageLog.hbm.xml"/><mappingresource="org/jbpm/logging/log/CompositeLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/ActionLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/NodeLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/ProcessStateLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/SignalLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/TokenCreateLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/TokenEndLog.hbm.xml"/><mappingresource="org/jbpm/graph/log/TransitionLog.hbm.xml"/><mappingresource="org/jbpm/context/log/VariableLog.hbm.xml"/><mappingresource="org/jbpm/context/log/VariableCreateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/VariableDeleteLog.hbm.xml"/><mappingresource="org/jbpm/context/log/VariableUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml"/><mappingresource="org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/TaskLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml"/><mappingresource="org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml"/></session-factory></hibernate-configuration>我们在web应用项目的web.xml文件中定义JbpmContextFilter实现JBPMCONTEXT的初始化<filter><filter-name>JbpmContextFilter</filter-name><filter-class>org.jbpm.web.JbpmContextFilter</filter-class></filter><filter-mapping><filter-name>JbpmContextFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>到这里,jbpm的配置已经基本完成,关于jbpm详细资料大家可以参考jbpm用户指南,这里就不多说。子流程的使用成果介绍详细阐述开发成果评审标准:清楚介绍开发成果是相对独立的。设计思路描述主要的设计思路,开发方法以及技术要点评审标准:清晰表达设计思路和技术要点在jbpm中,我们可以将一个复杂的业务流程文件根据业务逻辑的不同划分为父可以方便我们将来的维护,只对需要修改的流程进行修改,而不影响其他流程。如何使用员按照此成果报告,能够进行一般简单的开发,具有较强的可操作性。评审标准:开发人员按此使用说明基本能应用成果进行开发这里我们介绍下关于jbpmxml文件,一个是父流程定义文件,一个是子流程定义文件。这里我想当执行完Payfirst任务的时候,jbpm流程能自动去我的子流程文件中去执行那边定义的任务。这里是父流程processdefinition.xml<?xmlversion="1.0"encoding="UTF-8"?><process-definitionxmlns="urn::jpdl-3.2"name="myapp">。。。。。。<task-nodename="PayFirst"><taskname="PayFirstTask"swimlane="finance"></task><transitionname="gethousecontract"to="subprocess"><actionname="action"class="com.myapp.action.MessageActionHandler"><message>Haspayfirstbulkofmoney.Printconstractnow!</message></action></transition></task-node><process-statename="subprocess"><sub-processname="subprocessdefinition"/><transitionto="end"></transition></process-state><task-nodename="passroundforperusal"signal="last-wait"create-tasks="false"><taskname="perusal"><assignmentactor-id="#{processStarter}"></assignment></task><eventtype="node-enter"><actionname="createInstance"class="com.myapp.action.CreateTaskInstanceAction"></action></event><transitionname="backto"to="OnePersonAudit"></transition></task-node></process-definition>可以看到,上面我们使用到了,在jbpm中,process-state标签代表的是引用子流程。这里我们接着定义子流程文件。子流程subprocessdefinition定义文件<?xmlversion="1.0"encoding="UTF-8"?><process-definitionxmlns="urn::jpdl-3.2"name="subprocessdefinition"><swimlanename="service"><assignmentactor-id="service1"/></swimlane><start-statename="subStart"><transitionto="PrintContract"></transition></start-state><task-nodename="PrintContract"><taskname="PrintContractTask"swimlane="service"></task><transitionname="PrintContract"to="end"><actionname="action"class="com.myapp.action.MessageActionHandler"><message>Finishtheprocessinstancenow.</message></action></transition></task-node><end-statename="end"></end-state></process-definition>示例实现如示例实现的项目工程评审标准:能简单展示开发成果的开发应用上面我们定义了两个XML时候一定要先部署子流程,然后在部署父流程。ProcessDefinitionsubProcess=ProcessDefinition.parseXmlResource("subprocessdefinition/processdefinition.xml");jbpmContext.deployProcessDefinition(subProcess);ProcessDefinitionprocessDefinition=ProcessDefinition.parseXmlResource("processdefinition.xml");jbpmContext.deployProcessDefinition(processDefinition);部署完后,jbpm会将这两个流程定义文件保存在jbpm_processinstance表中,PrintContract任务的end()jbpm行。使用规范约定、约束等评审标准:清晰、详细描述出其应用规范注意事项描述配置、开发等需要注意的问题,包括各种关键点和难点。可逐步补充里找到答案使用子流程要注意:程的异常直接查看jbpm_Token或者jbpm_log无法找到流程间的关系,需要查看jbpm_processinstance表,才能找到父流程,因为Token在离开processstate的时候就会删除subprocessid,直接看jbpm_log也无法看出两个token之间的关系。应用系统与jBPM的结合成果介绍在实际开发使用jBPMjBPM系统与业务系统完全分离的策略。jBPM系统只负责流程的监控和执行,业务的重心仍然是实际业务需求。设计思路务在jBPM流程系统中建立相关流程,提供相关流程的监控和执行接口,客户端可以通过这些接口对流程进行操作。启动一个流程实例时,首先访问流程系统,取得一个新的流程实例ID。在业务系统中保存这个ID。在进行流程监控和执行时,根据这个ID对流程实例进行操作。如何使用以上面购房流程为例说明,将客户购房过程在一个Order中进行处理。客户登记看房,启动一个流程实例,取得流程ID,保存在Order中API查找当前任务,执行任务时,一方面执行流程,一方面修改Order记录。示例实现Order要记录流程ID。publicclassOrderimplementsSerializable{privateLongid;privateLongprocessId;}流程和业务系统的接口为OrderManager和BpmManager。客户看房登录时先启动一个流程。BpmManagerbpmManger=...;LongprocessId=bpmManager.createProcess();Orderorder=newOrder();order.setProcessId(processId);session.save(order);在后面的步骤中,可以根据Order的processId取得流程ID,执行流程任务。bpmManager.executeProcessTask();session.update(order);注意事项应用系统中用户角色如何与jBPM结合成果介绍应用系统中的用户应该与jBPM流程系统中一致,必须统一起来才能使用。一方面可以采用用户帐号同步的策略,从业务系统复制必要的用户信息到jBPM流程业务系统从最基本的用户账号上扩展用户信息。设计思路Hibernate使用一个用户账号表,不同映射文件,保持系统的相对独立性。如何使用jBPM中用户是由identity模块提供,在实际开发中,可以以jBPM中提供的用户表为基础,应用系统的较详细的用户信息在上面扩展。也可以建立一个基础的用户帐号,jBPM中的用户与应用系统中的用户在它的基础上扩展。示例实现jBPM中User提供了几最基本的字段。publicclassUserextendsEntityimplementsPrincipal{privatestaticfinallongserialVersionUID=1L;protectedStringpassword=null;protectedStringemail=null;protectedSetmemberships=null;publicUser(){}publicUser(Stringname){super(name);}}Hibernate映射文件内容为:<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mappingauto-import="false"default-access="field"><classname="org.jbpm.identity.User"table="JBPM_ID_USER"discriminator-value="U"><idname="id"column="ID_"><generatorclass="native"/></id><discriminatortype="char"column="CLASS_"/><propertyname="name"column="NAME_"/><propertyname="email"column="EMAIL_"/><propertyname="password"column="PASSWORD_"/><setname="memberships"cascade="all"><keycolumn="USER_"/><one-to-manyclass="org.jbpm.identity.Membership"/></set><setname="permissions"cascade="all"table="JBPM_ID_PERMISSIONS"><keycolumn="ENTITY_"foreign-key="none"/><elementtype="org.jbpm.identity.hibernate.PermissionUserType"><columnname="CLASS_"/><columnname="NAME_"/><columnname="ACTION_"/></element></set></class></hibernate-mapping>CustomUserjBPM中的User中继承的策略,它多出一个字段carId。publicclassCustomUserextendsUser{privateStringcardId;publicStringgetCardId(){returncardId;}publicvoidsetCardId(StringcardId){this.cardId=cardId;}}映射文件为:<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mappingauto-import="false"default-access="field"><subclassname="com.sample.model.CustomUser"extends="org.jbpm.identity.User"discriminator-value="U"><jointable="CUSTOM_USER"><keycolumn="ID_"></key><propertyname="cardId"column="CARDID_"/></join></subclass></hibernate-mapping>这里,CustomUser是从jBPM中的User继承的。jBPM当前版本的稳定性评估成果介绍通过官方jbpmRoadMap以及jbpmjirajbpm的版本更jbpm4.0到jbpm3.2.1版本,而且从jira上发现jbpm3.3jira上看,目前版本升级主要是bug的修改和功能的完善。流程执行步骤耗时阀值和自动提醒设置成果介绍Jbpm内置调度功能,jbpm的调度部分分为2块,timer主要是流程设计人员的工作,将timer放置到流程中;scheduler是jbpm自己维护的,我们只需要在后台进行调用即可。设计思路流程执行可以建立或删除定时器.定时器存放在一个timerstore里.当一个定时器的运行必须先从timerstore里面取得并且在根据指定的时间来启动该定时器Jbpm时间管理思路整体来说实现的非常清晰:1、引擎解析流程定义xml时,给相应的事件挂接上create-timer和cancel-timer动作2、流程实例实际运转时,create-timer动作在相应事件触发时执行3create-timer在job表里插入相应时间jobjob记录附上计算完毕的执行时间4、JobExecutorServlet在后台启动一到多个JobExecutorThread线程5、JobExecutorThread线程不停的每隔一段时间对job表扫描一次,找出需要执行的job记录,执行之6、只执行一次的job记录,执行完毕后删除之;重复执行的job记录,写入新的执行时间,更新之7、相应事件触发cancel-timer动作,将对应job记录从job表里删除如何使用jBPM通过定时器(timer)实现日程调度。在node中加入timer元素,即可实现基于定时器的节点执行监控,实现自动提醒功能。jbpm提供了2种调用scheduler的方法:一种是用在web应用的,采用org.jbpm.scheduler.impl.SchedulerServlet,具体的方法这个类的javadocweb.xml中加载它就行了;另一种是针对的c-s程序,jbpm提供了一个很好的示例org.jbpm.scheduler.impl.SchedulerMain,我们可以参照它编写我们自己的Scheduler。实例实现最容易的方法指定一个定时器是在节点里加入定时器元素.运用action的timer的例子<statename='catchcrooks'><timername='reminder'duedate='3businesshours'repeat='10businessminutes'transition='time-out-transition'><actionclass='the-remainder-action-class-name'/>timer>state>运用script的timer的例子<statename='catchcrooks'><timername='reminder'duedate='3businesshours'repeat='10businessminutes'transition='time-out-transition'><script>System.out.println(newDate())script>timer>state>state'catchcrooks'reminder即被创建。该定时器延迟3businesshours开始执行动作,每10businessminutes重复执行一次,到期后马上执行action类中的Java代码,然后实施time-out-transition(或script打印时间)迁移。通过在事件的action中加入create-timer和cancel-timer动作,可以分别实现事件对定时器的创建和取消。定时器timer可以被用于decisionforkjoinnodeprocess-statestatesuper-statetask-node等节点,可以设置开始时间duedate和频率repeat,定时器动作可以是所支持的任何动作action或scriptcreate-timer和cancel-timer素只是create-timer动作依附于node-enter事件、cancel-timer动作依附于node-leave事件的一个简略表示。说说整个过程:1、令牌进入节点catchcrooks2、timer被触发(实际这时是在执行create-timer动作)3、3businesshours后timer事件触发4、定义的action被执行5、令牌顺着time-out-transition路径离开catchcrooks节点6、cancel-timer动作被执行即timer终止(没有给repeat的机会)timer要先启动scheduler,如果是web项目则只要在web.xml中配置JbpmThreadsServlet,这样在项目启动后会自动开启scheduler。JbpmThreadsServlet配置如下:<!--JbpmThreadsServlet--><servlet><servlet-name>JbpmThreadsServletservlet-name><servlet-class>org.jbpm.web.JbpmThreadsServletservlet-class><load-on-startup>1load-on-startup>servlet><servlet-mapping><servlet-name>JbpmThreadsServletservlet-name><url-pattern>/threadsurl-pattern>servlet-mapping>注意事项对time节点来说namerepeattransition说,每一个time节点的name必须唯一,如果你不定义name属性,引擎会默认把node节点的name赋给timertimer节点的namename就会是catchcrooksrepeat则timer就会只执行一次动作不会重复执行。transition属性,如果定义了这个属性,流程令牌会在timer执行动作完毕后,顺着这个路径离开node节点。所以在上面这个例子里,尽管定义了repeat属性,action还是会只执行一次。action节点,可选,即timer节点在时间到时执行的动作,可以是任意action类型,包括script。注意与时间有关的两种action类型:create-timer和cancel-timertimer节点在被引擎解释时就是被分解为create-timer和cancel-timer两个action,create-timer挂接到node-enter事件中,cancel-timer挂接到node-leave事件中。action节点最多只可以挂一个。传阅功能的实现成果介绍传阅功能是管理系统中比较常见的一个功能,这里使用jbpm实现该功能。设计思路这里通过使用jbpm的transition来实现传阅功能。如何使用关于jbpm的transition使用很简单,大家可以参考jbpm用户指南示例实现<task-nodename="Coding"><taskname="Coding"swimlane="programmer"/><transitionname="to_CodeReview"to="CodeReview"></transition><transitionname="to_IntegratedTest"to="IntegratedTest"></transition></task-node><task-nodename="CodeReview"><taskname="ReviewCode"swimlane="manager"/></task><transitionname="to_Coding"to="Coding"></transition></task-node>上面是一个“代码检查”的类似传阅的流程,程序员编写完代码之后需要传给manager进行代码审查,manager审查完毕需要发回给程序员。动态指定执行者成果介绍上面讲了传阅功能的实现,但大家可以发现,上面的例子只能传阅给流程定义xml可能执行者会经常改变。这里我们介绍如何给任务动态指定执行者。设计思路这里我们是通过jbpm的ActionHandler操作动态指定执行者的操作,当进入该任务节点的时候,我们可以通过为该任务指定一个action操作,该操作根据业务规则进行任务执行者的动态指定。如何使用我们可以在一个任务task节点使用assignment标签指定运行该任务的执行者,如果没指定的人则不能执行该任务,另外我们也可以通过action操作来在程序中动态设置assignment中的执行人来实现,这里可以是一个或多个执行人。示例实现首先我们将流程在processdefinition.xml定义,示例如下:<?xmlversion="1.0"encoding="UTF-8"?><process-definitionxmlns="urn::jpdl-3.2"name="myapp"><task-nodename="OnePersonAudit"><taskname="OnePersonAuditTask"swimlane="manager"><controller><variablename="pass"access="read,write,required"></variable></controller></task><!--eventtype="node-leave"><actionname="createInstance"class="com.myapp.action.Cre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论