论坛首页 Java企业应用论坛

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

浏览 10229 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-21  

   开始试着集成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怎么处理?

 

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

 

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

c: Card()
eval(....||.....)
0 请登录后投票
   发表时间:2007-04-21  
eval里面在3.0.6只能写 方法,不能 写 a.abc ,只能写a.getAbc()
现在写的规则文件繁琐又难看...
0 请登录后投票
   发表时间:2007-04-21  
eyejava 写道
eval里面在3.0.6只能写 方法,不能 写 a.abc ,只能写a.getAbc()
现在写的规则文件繁琐又难看...

eval的存在不是为了做简单的域约束。 再说再难看么客户也看不到,实在自己受不了么,用ognl封一下好了。
0 请登录后投票
   发表时间:2007-04-21  
drools文档中明确指出 不赞同在rule中调用工作流。rule只做一个决策节点。
在lhs动态eval是很低效的,rete匹配树要重新生成,是rule engine中最重量级操作之一。
0 请登录后投票
   发表时间:2007-04-21  
我一直想问一个问题,在这个系统中,rule engine的end user是谁,在我看来end user是开发人员。而就我所理解,rule engine的商业价值在于其能够让系统开放接口给非技术的业务专家,通过业务专家制定业务规则来决定系统行为。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics