- 浏览: 459649 次
- 性别:
- 来自: 陕西.西安
文章分类
最新评论
-
gaodadawei:
登录失败,请重试楼主,我目前遇到这样一个错误,claros i ...
James+Claros+intouch2.1配置 -
VerRan:
qq346448412 写道请问。你上一节、 用的ORACLE ...
James+Claros+intouch2.1配置 -
qq346448412:
请问。你上一节、 用的ORACLE数据库、 这一节又用的是MY ...
James+Claros+intouch2.1配置 -
paladin1988:
good,我喜欢..
Hibernate自关联关系 -
lygxy12:
请问,能给163发邮件吗?该怎么配置?我安装上面的操作,发给1 ...
James+Claros+intouch2.1配置
背景介绍:
电信BOSS系统其中很重要的信息就是订单,所有的业务受理,投诉,建议,咨询,报障信息都是依托订单来实现的,订单贯穿于整个业务的执行流程。订单生命周期描述如下:
1. 通过受理中心生成订单信息。
2. 对订单进行收费。
3. 营业厅班长对订单进行审核。(包括人工审核和自动审核)。审核校验订单的信息,后台的审核包括对订单的流向进行初步分流,比如有些订单是不需要进入后台施工流程的,此时审核就将此单流程定向到待竣工,如果要走后台流程则将订单放入分解队列进行分解。
4. 订单进行分解,将需要发送后台施工的订单进行分解,通过分解来细化订单这里分解遵循一定的分解规则,比如每个产品单分解成一个服务订单由于发送后台施工。通过分解队列获取需要分解的订单,并根据特定规则进行分解。
5. 订单发送,将分解完的订单通过订单发送将订单发送到后台施工系统(在电信里负责后台施工调度的是 服务开通系统),这里的发送需要将分解后的订单,将订单相关的产品信息,产品属性信息,产品地址信息,产品资源信息…..等信息组织成xml信息发送到后台。
6. 后台施工完毕返单,当后台施工完毕后 服务开通系统通过返单操作,通知前台受理系统订单后台施工完毕,综合受理系统将订单迁移到待竣工状态。
7. 订单竣工,当订单下的所有明细都到待竣工状态时通过竣工将订单包含的信息持久化到统一客户资料系统,统一客户资料系统并将数据同步到计费系统。这样前台的数据就都处理完成了,剩下的就是计费去算费用了。
从流程化和规则化可配置化的角度考虑,订单的整个生命周期可以理解为一个工作流程,包含了以下流程节点:
订单受理、收费、订单审核、订单分解、订单发送、返单、订单竣工
* 流程定义:
<?xml version="1.0" encoding="UTF-8"?> <process name="OrderManage" xmlns="http://jbpm.org/4.4/jpdl"> <start g="128,-6,48,48" name="start1"> <transition g="-47,-4" name="to Caculate deciFee" to="DeciFee" /> </start> <java class="com.lht.OrderManagement.FeeManagement" g="264,126,92,52" method="caculateFee" name="CaculateFee" var="retMsg"> <arg> <object expr="#{orderId}" /> </arg> <transition g="-53,-19" name="to OrderAudit" to="OrderAudit" /> </java> <java class="com.lht.OrderManagement.OrderAuditRule" g="142,136,92,52" method="audit" name="OrderAudit"> <arg> <object expr="#{orderId}" /> </arg> <transition g="-85,-6" name="to OrderDispatch" to="OrderDispatch" /> </java> <java class="com.lht.OrderManagement.OrderDispathRule" g="125,217,92,52" method="dispatch" name="OrderDispatch"> <arg> <object expr="#{orderId}" /> </arg> <transition g="-70,-7" name="to OrderSend" to="OrderSend" /> </java> <java class="com.lht.OrderManagement.OrderSendRule" g="147,294,92,52" method="send" name="OrderSend"> <arg> <object expr="#{orderId}" /> </arg> <transition g="-82,-18" name="to OrderArchive" to="OrderArchive" /> </java> <java class="com.lht.OrderManagement.OrderArchiveRule" g="150,369,92,52" method="achive" name="OrderArchive"> <arg> <object expr="#{orderId}" /> </arg> <transition g="-42,-11" name="to OrderEnd" to="OrderEnd" /> </java> <end g="170,458,48,48" name="OrderEnd" /> <end-cancel g="34,15,48,48" name="Cancel" /> <decision name="DeciFee" g="309,56,48,48"> <handler class="com.lht.dao.decisionHandler.OrderFeeDecisionHandler" /> <transition name="to errorDeal" to="ErrorDeal" g="-54,-18"> </transition> <transition name="to CaculateFee" to="CaculateFee" g="-78,-18"></transition> </decision> <java class="com.lht.OrderManagement.ErrorDealRule" g="35,93,92,52" method="errorDeal" name="ErrorDeal"> <transition g="-44,-5" name="to Cancel" to="Cancel" /> </java> </process>
当订单状态不为10(收费环节)时订单直接终止,不走自动流程并返回费用未收取。
* 流程节点执行操作实现
收费环节:
package com.lht.OrderManagement; import com.lht.dao.CustOrderDAO; import com.lht.util.LogUtil; import com.lht.vo.Order; public class FeeManagement { public FeeManagement() { } public String caculateFee(String orderId) { Order order = new CustOrderDAO().queryOrderIngfo(orderId); String ret = "20"; LogUtil.debug("开始计算费用信息 订单编号是:" + order.getOrderId() + ";" + order.getOrderState()); OrderManagementRule rule = new OrderManagementRule(); rule.validateOrderExists("OrderManage.drl", order); return ret; } }
收费环节调用 订单管理规则,执行Drools定义的订单收费规则。
* Drools 实现收费业务规则
** drools 规则定义
当订单编号不为空,同时订单状态为收费环节时则执行收费操作
package com.sample import function com.lht.util.LogUtil.debug; import com.lht.vo.Order; import com.lht.dao.CustOrderDAO; rule "isFeeState" no-loop true activation-group "feeState" when $order:Order(orderId!=null&&orderId!=""&&orderState=="10"); then debug("订单处于收费岗"); CustOrderDAO dao=new CustOrderDAO(); boolean flag=dao.isOrderExists($order.getOrderId()); debug("收费完毕订单状态转移到审核岗"); $order.setMsg("收费成功"); $order.setOrderState("20"); update($order); end rule "isNotFeeState" no-loop true enabled false activation-group "feeState" when $order:Order(orderId!=null&&orderId!=""&&orderState!="10"); then debug("订单不在收费岗,终止流程"); $order.setMsg("订单未收费"); update($order); end
isFeeState 规则执行了以上判断
boolean flag=dao.isOrderExists($order.getOrderId()); 实现了收费操作。
* 订单管理规则类调用drools规则,执行收费操作
package com.lht.OrderManagement; import org.drools.KnowledgeBase; import org.drools.runtime.StatefulKnowledgeSession; import com.lht.util.DroolsUtil; import com.lht.util.LogUtil; import com.lht.vo.Order; public class OrderManagementRule { public OrderManagementRule() { } public String validateOrderExists(String drlFile, Order order) { KnowledgeBase kbase = DroolsUtil.readKnowledgeBase(drlFile); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert(order); ksession.fireAllRules(); LogUtil.debug("Next OrderState is " + order.getOrderState()); LogUtil.debug("流程处理结果:" + order.getMsg()); return order.getMsg(); } }
package com.lht.util; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; public class DroolsUtil { public static KnowledgeBase readKnowledgeBase(String drlFile) { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource(drlFile), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } }
droolsUtil 实现规则文件的执行,创建知识库
* 启动业务流程引擎
package com.lht.test; import java.util.HashMap; import java.util.Map; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.ProcessInstance; import com.lht.dao.CustOrderDAO; import com.lht.util.LogUtil; import com.lht.vo.Order; public class ProcessEngineLearn { public static String deployProcess(ProcessEngine pe, String jpdlPath) { return pe.getRepositoryService().createDeployment() .addResourceFromClasspath(jpdlPath).deploy(); } public static void deleteProcessInst(ProcessEngine pe, String processInstId) { pe.getRepositoryService().deleteDeployment(processInstId); } public static ProcessInstance excuteProcess(ProcessEngine pe, String key, Map<String, Object> variables) { return pe.getExecutionService().startProcessInstanceByKey(key, variables); } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { ProcessEngine pe = new Configuration().buildProcessEngine(); deployProcess(pe, "com\\lht\\OrderManagement\\OrderManage.jpdl.xml"); Map<String, Object> variables = new HashMap<String, Object>(); String orderId="1016921081"; Order order = new CustOrderDAO().queryOrderIngfo(orderId); variables.put("orderId", order.getOrderId());// 传入流程的参数 variables.put("orderState", order.getOrderState());// 传入流程的参数 } }
* 执行结果
2010-08-04 17:39:13 开始计算费用信息 订单编号是:1016921081;10 2010-08-04 17:39:18 订单处于收费岗 2010-08-04 17:39:19 收费结果是:true 2010-08-04 17:39:19 收费完毕订单状态转移到审核岗 2010-08-04 17:39:19 Next OrderState is 20 2010-08-04 17:39:19 流程处理结果收费成功 2010-08-04 17:39:20 开始订单审核1016921081 2010-08-04 17:39:21 开始订单分解1016921081 2010-08-04 17:39:22 开始订单发送1016921081 2010-08-04 17:39:23 订单开始竣工1016921081
发表评论
-
AKKA 学习笔记之1
2013-09-15 15:08 23536AKKA 是一款基于actor模型实现的 并发处理框架。基 ... -
Ant 集成 junit 自动生成测试报告
2013-08-28 08:56 1025在当下Maven 统治大片江山,Gradle后起之秀的情况 ... -
很有用的测试工具
2013-08-27 11:21 7181. findbugs findbugs是一种静态 ... -
java 之 JNI
2013-08-27 11:06 1692前言: 在查看java socket实现代码时最终发现其 ... -
HSQLDB实现学习笔记-数据库服务器连接
2013-08-27 10:27 12681 数据库服务器连接 主要用于描述客户端是如何与 ... -
HSQLDB实现学习笔记-数据库服务器创建
2013-08-27 10:16 2987前言: HSQLDB作为一个纯java实现的开源数据库, ... -
反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)(转)2
2011-04-13 14:01 12111package sinosoft.dj.aop ... -
反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)(转)
2011-04-13 13:49 875转自: http://www.blogjava.net/Do ... -
Sun Remote Procedure Call
2011-04-05 15:45 1330Most network programming is ... -
pushlet
2011-03-31 22:54 880http://baike.baidu.com/view/246 ... -
Comet:基于 HTTP 长连接的“服务器推”技术(转)
2011-03-31 22:39 882http://www.ibm.com/developerwor ... -
冒泡排序
2011-03-30 16:03 992package com.datastruct.sort; ... -
快速排序
2011-03-30 16:02 943package com.datastruct.sort; ... -
Cookie
2011-03-30 14:11 8051、登录www.iteye.com 输入用户名,密 ... -
OCP秘笈
2011-03-29 22:19 735http://oracle.chinaitlab.com/Sp ... -
HashCode计算方法
2011-03-29 17:34 967Returns a hash code for this ... -
Merkle-Hellman背包算法
2011-03-23 17:54 1117转自:http://baike.baidu.com/view/ ... -
Android webService访问实例
2011-03-23 13:09 4293参考网上的例子实现一个简单的天气查看功能。 界面包含一个按钮, ... -
Android 源码查看
2011-03-22 14:10 1563在网上看了几个关于源码查看的方法但是都不是很清晰,此文列出 ... -
在Android中解析XML数据
2011-03-21 22:20 976http://www.williamhua.com/2009/ ...
相关推荐
jBPM(jBoss Business Process Management)则是一个开源的工作流和业务流程管理系统,用于管理业务流程的生命周期,包括设计、部署、执行、监控和优化。jBPM支持BPMN2.0标准,提供图形化的流程设计工具,使得流程的...
这个“jbpm+S2SH请假流程经典实现及源码”是一个实际的应用示例,它将jbpm的工作流引擎与S2SH框架集成,用于实现一个完整的请假流程管理。 首先,jbpm的核心功能包括流程建模、流程实例管理、任务管理和事件处理等...
jBPM4+drools实战_1_课程介绍及项目需求.ppt
jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip
综上所述,"jbpm-jpdl-designer-nodeps-3.1.4"提供了独立于特定依赖环境的Jbpm流程设计器,便于开发者通过JPDL来定义和管理业务流程。它包含的文档和资源有助于用户安装、理解和使用该工具,同时遵守相应的开源许可...
JBPM是一个开源的工作流和业务流程管理系统,它提供了对业务流程的建模、部署、执行、监控和管理功能。这款3.0.13版本的jdpm编辑器是MyEclipse集成开发环境的一个插件,用于图形化设计流程定义语言(JPDL)。 JPDL...
jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载
drools-persistence-jpa-5.2.0.Final-sources.jar jbpm5 源码
本实例"jbpm+SSH实例(报销流程)"旨在帮助初学者理解如何利用jbpm设计和实现一个报销流程,并结合SSH框架进行部署和运行。报销流程是企业日常运营中常见的例子,它包括申请、审批、支付等环节,非常适合用来展示工作...
《JBoss+jBPM+jPDL用户...通过阅读《JBoss+jBPM+jPDL用户开发手册_3.2.3》,开发者能够熟练掌握在JBoss平台上利用jBPM和jPDL进行业务流程自动化的方法,从而提升企业的流程管理效率,实现更高效、更灵活的业务运营。
在这个教程中,我们将深入理解jbpm4的工作原理以及如何将其与SSH框架集成,以构建一个完整的业务流程管理系统。 jbpm4是Java Business Process Management的第四个版本,它是一个开源的工作流和业务流程管理(BPM)...
Jbpm是一个开源的工作流程管理系统,它主要用于设计、部署和执行业务流程。这个"jbpm-6.5.0.Final-installer-full.zip"压缩包是JbPM 6.5.0最终版本的完整安装程序,包含了所有必要的组件,方便用户在本地环境中搭建...
在这个过程中,Eclipse作为开发工具,可以辅助进行流程图的设计和调试,drools-guvnor则提供了规则管理,designer用于图形化设计流程,而jbpm-gwt-console则是用户交互的前端界面。 请注意,由于jbpm5的版本较旧,...
标题中的"SSH所有jar+jbpm+json+extjs"提到了几个关键的软件开发组件,这些组件在Java Web开发中扮演着重要角色。SSH是一个常见的缩写,它代表Spring、Struts和Hibernate三个框架,它们是Java企业级应用开发的基石。...
jbpm,全称为Business Process Management,是一个开源的工作流和业务流程管理平台。它可以用于设计、执行和管理业务流程。jbpm允许开发者定义流程图,这些流程图可以描述一系列的任务和决策,从而自动化复杂的业务...
此外,还可以考虑使用工作流引擎如jBPM来配合drools,实现更复杂的业务流程控制。 这个"drools集成springboot demo"项目,就是一个实际的应用示例,展示了如何在SpringBoot环境中有效地使用drools进行业务规则的...
在"jbpm+bibernate jar包"中,`lib`目录很可能包含了jbPM和Hibernate的jar文件,以及其他依赖库,这些库可能包含了用于数据库连接、日志记录、XML解析等功能的组件。为了使用这些框架,开发者需要将这些jar文件添加...
【jbpm + struts + spring + tomcat】项目是一个经典的Java企业级应用架构组合,它将业务流程管理(BPM)工具jbpm、MVC框架Struts、依赖注入容器Spring和应用服务器Tomcat整合在一起,为开发高效、可维护的企业应用...
【jbpm+ssh整合】是将企业级工作流引擎jbpm与流行的SSH(Struts、Spring、Hibernate)框架集成,实现一个完整的业务流程管理系统。jbpm是一个开源的工作流引擎,可以处理复杂的业务流程自动化,而SSH是Java开发中...
这份文档对于想要学习或实践jbpm与SSH集成的开发者来说是一份宝贵的资源,可以帮助他们快速理解和实现业务流程管理与Web应用的无缝结合。 通过这个示例,开发者可以学习到如何在实际项目中有效地整合各种技术,提升...