- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试执行一个非常基本的示例,演示 accumulate()
的使用Drools 的函数,但出现 java.lang.NullPointerException 异常。
代码如下:
Metric.java:
package com.sample;
public class Metric
{
public String id;
public double value;
public Metric(String id, double value)
{
this.id = id;
this.value = value;
}
}
ruleFile1.drl:
package com.sample
declare Metric
@role( event )
end
rule "rule1"
when
Metric()
metricAverage: Number() from accumulate(
Metric( $value : value ),
average( $value ) )
then
System.out.println("metric value average " + metricAverage);
end
KSessionGenerator.java:
package com.sample;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Message;
import org.kie.api.builder.Results;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class KSessionGenerator {
public KieSession buildKSession(String ruleFilePath){
KieServices kieServices = KieServices.Factory.get();
FileInputStream fis = null;
try {
fis = new FileInputStream(ruleFilePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
String virtualRuleFilePath = "src/main/resources/ruleFile1.drl";
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write(virtualRuleFilePath, kieServices.getResources().newInputStreamResource(fis));
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
Results results = kieBuilder.getResults();
if (results.hasMessages(Message.Level.ERROR)) {
System.out.println(results.getMessages());
throw new IllegalStateException("### errors ###");
}
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
// Change the engine mode to 'stream'
KieBaseConfiguration config = kieServices.newKieBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );
KieBase kieBase = kieContainer.newKieBase( config );
KieSession kSession = kieBase.newKieSession();
return kSession;
}
}
DroolsTest1.java:
package com.sample;
import org.kie.api.runtime.KieSession;
public class DroolsTest1 {
public static final void main(String[] args) {
try {
String ruleFilePath = "src/main/resources/rules/ruleFile1.drl";
KieSession kSession = (new KSessionGenerator()).buildKSession(ruleFilePath);
// go !
Metric metric1 = new Metric("m1", 50);
Metric metric2 = new Metric("m2", 60);
kSession.insert(metric1);
kSession.insert(metric2);
System.out.println("Firing all rules ...");
kSession.fireAllRules();
System.out.println("Rules fired!");
System.out.println("Bye");
} catch (Throwable t) {
t.printStackTrace();
}
}
}
kmodule.xml:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
异常的完整堆栈跟踪:
Firing all rules ...
java.lang.RuntimeException: java.lang.NullPointerException
at org.drools.core.rule.SingleAccumulate.accumulate(SingleAccumulate.java:90)
at org.drools.core.phreak.PhreakAccumulateNode.addMatch(PhreakAccumulateNode.java:759)
at org.drools.core.phreak.PhreakAccumulateNode.doLeftInserts(PhreakAccumulateNode.java:163)
at org.drools.core.phreak.PhreakAccumulateNode.doNode(PhreakAccumulateNode.java:80)
at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:562)
at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:533)
at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:334)
at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:235)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:106)
at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1016)
at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262)
at com.sample.DroolsTest1.main(DroolsTest1.java:20)
Caused by: java.lang.NullPointerException
at org.drools.core.rule.Declaration.getValue(Declaration.java:228)
at com.sample.Rule_rule11017979978AccumulateExpression0Invoker.evaluate(Rule_rule11017979978AccumulateExpression0Invoker.java:19)
at org.drools.core.base.accumulators.JavaAccumulatorFunctionExecutor.accumulate(JavaAccumulatorFunctionExecutor.java:109)
at org.drools.core.rule.SingleAccumulate.accumulate(SingleAccumulate.java:82)
... 15 more
我正在 Eclipse Mars 4.5.2 上通过插件使用 Drools 版本 6.2.0 Final
谁能告诉我错误的原因及其解决方案吗?
最佳答案
尝试了代码,NPE是由
引起的"$value" -> "Method threw 'java.lang.NullPointerException' exception.
Cannot evaluate org.drools.core.rule.Declaration.toString()"
这是由于 Metric 类的字段没有任何 getter 方法。添加 getter,代码将毫无问题地执行
关于java - Drools acquire() 的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785740/
condition.acquire(threading.Condition()) 是否类似于lock.acquire(threading.Lock)。两者都可以访问锁吗?我可以使用condition.
我正在尝试执行一个非常基本的示例,演示 accumulate() 的使用Drools 的函数,但出现 java.lang.NullPointerException 异常。 代码如下: Metric.j
我是java初学者,我正在尝试信号量。我尝试编写一个具有编写器和读取器的代码,我只尝试使用 acquire() 和 release(): 1) If a writer is writing, then
我的一个程序中有一个奇怪的问题,一个线程获取一个条件,而另一个线程告诉我没有获取该条件。 为了知道线程是否获得了条件,我做了一些调试信息,看起来是的,他做到了。但是另一个线程告诉我条件没有获得。 这是
我的类(class)有一个互斥锁,定义如下: ACE_Mutex m_specsMutex; 当我使用不带参数的 acquire() 方法时,一切正常。但是当我将它与时间值一起使用时(如下所示),它会
我使用 QSharedMemory 和 QSystemSemaphore 来组织多个进程之间的事件交换。 QSharedMemory 存储接收者的数量和事件数据。接收者在 QSystemSemapho
我正在为我的 REST 服务编写一个 API 库。在某些时候,访问 token 将需要更新。我正在尝试实现一种线程安全的方法来执行此操作,以便仅发送一个更新请求,即使多个线程可能想要同时更新它。 这是
我正在我的node.js 项目中使用MySQL 数据库。我用 Knex 创建了一个数据库查询,结果没问题。但是当我再次尝试查询时,出现此错误: Error: Unable to acquire a c
以下锁定机制用于防止 cron 作业并发运行: #!/bin/bash echo "Before critical section" ( flock -e 200 echo "In c
在 Python 3.4.3 上,我无法理解 threading.Lock.acquire() 如何阻塞,直到锁定状态设置为解锁。 threading.Lock 似乎是上面链接的 _dummy_thr
我有一段代码 locked = lock.acquire(False) if locked: break 根据 python 文档: lock.aquire(False):-
-Thread 1- y.store (20, memory_order_release); x.store (10, memory_order_release); -T
我最近在运行测试时遇到了这个错误。我在本地 MongoDB 服务器 (4.0.5) 上试过了,我也在 Mongo Atlas 上试过了,但遇到了同样的问题。 我尝试增加锁定超时,但没有效果。 我不确定
在Windows平台上,TCriticalSection是通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现的。 Microsof
我为我的数据库使用 mssql ( https://www.npmjs.com/package/mssql ) 模块。通常我使用导致 pg ( https://www.npmjs.com/packag
我在 Python 中有这个示例,它演示了条件变量的使用。 import logging import threading import time logging.basicConfig(level=
我希望我的应用保持 CPU 运行但关闭屏幕以最大限度地减少电力浪费。 关于此主题的先前帖子建议采用以下方法: mPm = (PowerManager) getSystemService(Con
是否可以在 C#.NET 应用程序中请求 Windows 7 PC 上的管理权限? 我希望能够通过 Click Once 部署应用程序,并让用户使用它来执行管理任务(在本例中,它正在为主应用程序编写注
我正在更新 Delphi (Delphi 2009) 代码,它专门使用 TCriticalSection.Acquire/Release 对,而不是 Enter/Release 或 Leave 对。我
我试图理解使用条件变量时丢失唤醒的问题。我相信我已经使用了下面正确的设计模式。消费者: lock the mutex while the condition is not satisfied
我是一名优秀的程序员,十分优秀!