`
sonic_yj
  • 浏览: 76222 次
  • 性别: Icon_minigender_1
  • 来自: CD
社区版块
存档分类
最新评论

学习集成和使用Drools 3 问题和求教

阅读更多

   开始试着集成Drools 3到开发框架中去,选了一个典型的ERP中订单转生产来配置规则来做测试 做着做着问题就来了

  业务简要描述:

     来了1笔订单明细,首先查询库房有没有存货,有转销售,没有转订单要求生产, 生产根据Bom分解内容,需要订货的订货,自己加工的分解加工,涉及到调用流程/数据保存的地方已经很好的集成进去了,规则无非就是判断做什么,可是下面的问题就头痛了,也许是刚入门的缘故,希望那位懂Drools的指点一下

    -----------------------------------------

  1. 基础问题,检查库存 LHS里面如何检查我的数量,我在global内集成一个hib方法,可以查询数量,可我看了半天也没明白怎么在LHS使用,或者说是用变量?我希望在Rule里面实现下面的效果,其中,ds,wf是global中引用的类

  1. rule "库存不足"  
  2.        
  3.     when   
  4.         od:Orders(count > ds.queryCount(od))   
  5.     then    
  6.         wf.createFlow("订单生产",od);          
  7. end  

 ps:上面的东西是没法通过jrule ide检查的 

  2. 难道我要为每一个产品分解建立一条规则?实现倒是没有问题,不过感觉似乎比使用Bom表方式效率低太多,应该不是最好的解决方式  

  1. rule "产品_1配料清单"  
  2.   when    
  3.      pd:product( name =="产品1")   
  4.   then   
  5.     ......   
  6. end   

3.上面的东西都是逐一处理,当然也可以,批量的东西怎么引入规则或者设计?比如给一个 List<Ordersdetail>, 其中一个detail或者所有detail来决定怎么处理 order怎么处理?

 

       也许问题很简单,也许我的用法就是错的,希望能有人指点一下。。

 

分享到:
评论
16 楼 Godlikeme 2007-04-23  
eyejava 写道
Godlikeme 写道
我一直想问一个问题,在这个系统中,rule engine的end user是谁,在我看来end user是开发人员。而就我所理解,rule engine的商业价值在于其能够让系统开放接口给非技术的业务专家,通过业务专家制定业务规则来决定系统行为。

对的,如果业务人员能定义自己的规则就完美了,问题是现在没有开源实现,路要一步步走


不是没有,只是不是太好,离终极目标有差距,ilog做的还算可以,主要问题是用起来很蹩脚,客户化也很难弄,webui功能太差。多数都是根据具体业务需求定制。
15 楼 Godlikeme 2007-04-23  
eyejava 写道
Godlikeme 写道
drools文档中明确指出 不赞同在rule中调用工作流。rule只做一个决策节点。
在lhs动态eval是很低效的,rete匹配树要重新生成,是rule engine中最重量级操作之一。

调用a.getAbc() 只是一个很简单的去参数的方法,跟工作流没有关系。

eval只需要编译一次,后面的根本不浪费时间,我测试下来 都是 0ms ,搞得我挺纳闷的...不过 加上数据库存取就有 15ms 了。


第一个问题:不是说的一件事,我说的是 rule.createflow()..
第二个问题:不知道如何做的测试,问题关键不在eval的过程,eval要重新构造reteoo,不知道3.1的实现是如何优化的。

14 楼 sonic_yj 2007-04-22  
dada 写道
“用简单的方式完成复杂的逻辑”也是它的竞争力所在,电信的计费系统就是很好的例子。


  我也是从这个认识开始接触Drools的,呵呵。现在我也很喜欢Drools引擎实施编译的灵活性
13 楼 sonic_yj 2007-04-22  
Godlikeme 写道
我一直想问一个问题,在这个系统中,rule engine的end user是谁,在我看来end user是开发人员。而就我所理解,rule engine的商业价值在于其能够让系统开放接口给非技术的业务专家,通过业务专家制定业务规则来决定系统行为。


  规则大家都明白,但是要变成规则语言的合理描述。个人感觉能有这种水平的用户是少之又少,想用好这个规则用法个人感觉一般都有软件方面背景。新的程序员都不一定会按规则方式思维。我目前对这个东西的定义是降低复杂度(开发和项目人员业务描述难度),还远远达不到给客户用的水平
12 楼 dada 2007-04-21  
Godlikeme 写道
我一直想问一个问题,在这个系统中,rule engine的end user是谁,在我看来end user是开发人员。而就我所理解,rule engine的商业价值在于其能够让系统开放接口给非技术的业务专家,通过业务专家制定业务规则来决定系统行为。

你说的是理想状态。目前,即使是像ilog这样的成熟产品,也不能直接提供给业务人员来完全定制。
drools就目前的3.1m1来看基本达到了可堪使用的要求。然而在易用性上还有所不足(针对开发人员),要达到你说的要求还是前路漫漫。当然Rule engine的商业价值不完全如你所说,“用简单的方式完成复杂的逻辑”也是它的竞争力所在,电信的计费系统就是很好的例子。
11 楼 eyejava 2007-04-21  
Godlikeme 写道
我一直想问一个问题,在这个系统中,rule engine的end user是谁,在我看来end user是开发人员。而就我所理解,rule engine的商业价值在于其能够让系统开放接口给非技术的业务专家,通过业务专家制定业务规则来决定系统行为。

对的,如果业务人员能定义自己的规则就完美了,问题是现在没有开源实现,路要一步步走
10 楼 eyejava 2007-04-21  
Godlikeme 写道
drools文档中明确指出 不赞同在rule中调用工作流。rule只做一个决策节点。
在lhs动态eval是很低效的,rete匹配树要重新生成,是rule engine中最重量级操作之一。

调用a.getAbc() 只是一个很简单的去参数的方法,跟工作流没有关系。

eval只需要编译一次,后面的根本不浪费时间,我测试下来 都是 0ms ,搞得我挺纳闷的...不过 加上数据库存取就有 15ms 了。
9 楼 Godlikeme 2007-04-21  
我一直想问一个问题,在这个系统中,rule engine的end user是谁,在我看来end user是开发人员。而就我所理解,rule engine的商业价值在于其能够让系统开放接口给非技术的业务专家,通过业务专家制定业务规则来决定系统行为。
8 楼 Godlikeme 2007-04-21  
drools文档中明确指出 不赞同在rule中调用工作流。rule只做一个决策节点。
在lhs动态eval是很低效的,rete匹配树要重新生成,是rule engine中最重量级操作之一。
7 楼 dada 2007-04-21  
eyejava 写道
eval里面在3.0.6只能写 方法,不能 写 a.abc ,只能写a.getAbc()
现在写的规则文件繁琐又难看...

eval的存在不是为了做简单的域约束。 再说再难看么客户也看不到,实在自己受不了么,用ognl封一下好了。
6 楼 eyejava 2007-04-21  
eval里面在3.0.6只能写 方法,不能 写 a.abc ,只能写a.getAbc()
现在写的规则文件繁琐又难看...
5 楼 dada 2007-04-20  
eyejava 写道
eval 和 || 不知道怎么一起用。
比如 c:( Card(eval(a<getParameter("a")))||Card(eval(b<getParameter("b"))) )
这种写法不起作用。

c: Card()
eval(....||.....)
4 楼 dada 2007-04-20  
global无法在lhs上使用。global在应用中的定位确实比较模糊,有n种可以替代它的方式,而他恰恰是最不灵活的方式,个人觉得是实实在在的鸡肋。
传入变量的方式其实很简单,把变量当作fact处理,多个fact进行交互。用这个方式也很容易解决2的问题,即在数据库里面维护一个决策表,这样你的规则不会有很多条。
3的问题我不是很理解,能举详细一点的例子吗?
3 楼 eyejava 2007-04-20  
eval 和 || 不知道怎么一起用。
比如 c:( Card(eval(a<getParameter("a")))||Card(eval(b<getParameter("b"))) )
这种写法不起作用。
2 楼 sonic_yj 2007-03-21  
quaff 写道
据我的了解drools只能对fact对象的属性进行等于大于小于的比较,你可以为fact增加一个动态属性,获取这个属性值的时候就去查一次数据库,也就是这个fact对象是一个rich domain object,可以把factManager注入到fact中去


谢谢,我试试这个思路,但是rich domain object 在使用hibernate等方面会有问题么?这个我比较担心

BTW,LHR使用函数比较方法我也找到了,Eval(express)就可以了,我只是需要找到怎么把调用或者传入变量就可以了

ex:

rule "库存量不足"
no-loop
when
od:Orders(count > 0,nm:name ,ct:count)
eval (isStored(nm,ct))
then
od.setStatus("生产中");
modify(od);
wf.createFlow("生产",od);
end

其中isStored是函数
1 楼 quaff 2007-03-21  
据我的了解drools只能对fact对象的属性进行等于大于小于的比较,你可以为fact增加一个动态属性,获取这个属性值的时候就去查一次数据库,也就是这个fact对象是一个rich domain object,可以把factManager注入到fact中去

相关推荐

Global site tag (gtag.js) - Google Analytics