论坛首页 Java企业应用论坛

Drools 3.1M中global的使用问题

浏览 5500 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-15  
做了个小实验:想周期性的去Ping一个服务器,然后计算服务器可用率,比方说两次中ping通了一次,可用率就是0.5。但这需要在drl文件中针对不同情况(on/off)对变量进行设置,并且保证在每次ping的过程中变量值可以累积。这怎么做呀??

我想这样的:在调用的主程序中assert一个含有俩变量的类对象,
ComputeUsage usage = new ComputeUsage();
		mem.assertObject(usage);


然后在drl中声明它为global
global ComputeUsage usage

在对应的rule中设置usage的值,
rule "Server On"
	salience 2000
	when
		#conditions
		server : Server(status == true)
	then 
		#actions
		System.out.println(server);
		//usage.setAvail(usage.getAvail()+1);
		//usage.setSum(usage.getSum()+1);
		computeUsage(server);
end

rule "Server Off"
	#include attributes such as "salience" here...
	salience 2000
	when
		#conditions
		server : Server(status == false)
	then 
		#actions
		System.out.println(server);
		//usage.setSum(usage.getSum()+1);
		computeUsage(server);
		// Inform the mangers
end


最后用一个函数对其进行计算并输出。
function void computeUsage(Server server) {
	System.out.println("The usage rate of the server ["+server.getHost()+"] is {"(usage.getAvail()/usage.getSum())"}\n");
	//System.err.println();
}


可是老是不正确。有如下错误:
Server [127.0.0.1]'s status is [false];    The Response time is (0)ms
java.lang.NullPointerException
	at audion.check.Rule_Server_Off_0.consequence(Rule_Server_Off_0.java:9)
	at audion.check.Rule_Server_Off_0ConsequenceInvoker.evaluate(Rule_Server_Off_0ConsequenceInvoker.java:23)
	at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:467)
	at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:431)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:360)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:341)
Chief Manager Haibin has been informed about the failure of server [127.0.0.1].

	at audion.checkserver.PingServer.main(PingServer.java:62)
Exception in thread "main" org.drools.spi.ConsequenceException: java.lang.NullPointerException
	at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:471)
	at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:431)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:360)
	at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:341)
	at audion.checkserver.PingServer.main(PingServer.java:62)
Caused by: java.lang.NullPointerException
	at audion.check.Rule_Server_Off_0.consequence(Rule_Server_Off_0.java:9)
	at audion.check.Rule_Server_Off_0ConsequenceInvoker.evaluate(Rule_Server_Off_0ConsequenceInvoker.java:23)
	at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:467)
	... 4 more

不知道怎么回事啊?这个global和function到底怎么用啊?谁可以给个例子啊?谢谢啦!

PS:我只是个新手,不大会。还有这个例子当然可以不用Drools做,可能会更简单。不过我只是想试试这种工具。
   发表时间:2007-04-15  
对于java 值对象数据域 的维护不要放在drools 判断逻辑里面做。
坚决杜绝再规则中调用 数据库、网络、i/o方面的method,同样,也不能写这样的util脚本。。

规则引擎适合对业务对象现有状况进行判断、监控业务对象的状态变化,作一些简单的结果设置。

记住:规则引擎是一个决策者,而不是执行者。
0 请登录后投票
   发表时间:2007-04-15  
嗯。是啊!
可是这个错误是为什么??很郁闷的说。没有资料可以参考。
0 请登录后投票
   发表时间:2007-04-15  
Godlikeme 写道
对于java 值对象数据域 的维护不要放在drools 判断逻辑里面做。
坚决杜绝再规则中调用 数据库、网络、i/o方面的method,同样,也不能写这样的util脚本。。

规则引擎适合对业务对象现有状况进行判断、监控业务对象的状态变化,作一些简单的结果设置。

记住:规则引擎是一个决策者,而不是执行者。


Godlikeme老兄,你似乎非常在意规则引擎应用的纯粹性,但推断了不反映谁来反应呢?自己再写一套IF Else么,如果是Drools这么用本身有问题,那当然另当别论。我觉得楼主的问题是没有处理好反映执行的问题。Godlikeme,我理解你的意思是担心业务连续性被这些异常给干掉了,是这样么?如果不是核心系统。我看这么做也没什么关系,我看没什么问题。

  btw:谈谈你认为更好的方式吧,说具体点,不要提得太笼统了,不是那么好理解。。 
0 请登录后投票
   发表时间:2007-04-15  
如果充当执行者,如何确定规则可执行的作用范围呢。如何评估执行结果对整个系统的影响。

系统会不会被异常干掉是系统的问题。这里讨论的是规则引擎角色的问题。
0 请登录后投票
   发表时间:2007-04-15  
Godlikeme 写道
如果充当执行者,如何确定规则可执行的作用范围呢。如何评估执行结果对整个系统的影响。

系统会不会被异常干掉是系统的问题。这里讨论的是规则引擎角色的问题。


角色:
  规则可用的程序,规则的角色?会不会太极端了一点?搞得跟操作系统一样了,呵呵。只要有权限运行规则应该就可以了

评估:
  评估对系统的影响。。。 我已经有点晕了,如果直接写代码来执行又如何评估范围和结果呢,应该也是一个反馈后来处理吧,可能我们站的角度不同,看到的东西不同,不过这么说我确实没有什么实质认识

  总结一下,我感觉对于规则专家知识库的用法,我觉得我们没什么实质性差异。差异出在规则推理出来了,是呈现给人来看,还是机器自己就做了。我的描述准确么?
0 请登录后投票
   发表时间:2007-04-15  
workingMemory.setGlobal("computeUsage",computeUsage );
0 请登录后投票
   发表时间:2007-04-15  
http://www.iteye.com/topic/7803?page=3

请阅读oz6的回复
0 请登录后投票
   发表时间:2007-04-16  
Godlikeme 写道
如果充当执行者,如何确定规则可执行的作用范围呢。如何评估执行结果对整个系统的影响。

系统会不会被异常干掉是系统的问题。这里讨论的是规则引擎角色的问题。


  oz6个人感觉写得比较深刻,很多东西我很有感受,当然有些我也没什么感受。但是,就跟他说的一样,关键是怎么用,怎么认识这个东西。规则我就是一个用来做判断业务规则耦合上下层的东西,这个东西对建模确实有影响,但是好好设计,外加注意避开一些问题完全不存在什么问题。还有一个额外的好处,这么做在做判断的时候确实非常清晰,降低了思考难度,分清楚了工作界限,这个对开发来说我认为很重要,至少效率挺高,改动起来,只要不动模型,一切都是几句不用编译的Rule。我在没有看到更好的方式的时候我会继续这么做,因为确实降低了我做东西的实施难度,也远比配置xml清晰灵活。
0 请登录后投票
论坛首页 Java企业应用版

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