org.drools.core.common.DefaultFactHandle不能强制转换为org.drools.core.common.EventFactHandle
我想用口水做一些警报。吼叫是规则。但是当我启动这个会话时。口水吐出一个例外。谁能告诉我为什么 规则: 例外情况: 线程“thread-0”java.lang.ClassCastException中的异常: 无法将org.drools.core.common.DefaultFactHandle强制转换为 org.drools.core.common.EventFactHandle位于 org.drools.core.reteoo.WindowNode.assertObject(WindowNode.java:168) 在 org.drools.core.reteoo.CompositeObjectSinkAdapter.doProPagateAserToObject(CompositeObjectSinkAdapter.java:502) 在 org.drools.core.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:387) 在 org.drools.core.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:288) 在 org.drools.core.reteoo.EntryPointNode.assertObject(EntryPointNode.java:251) 在 org.drools.core.common.NamedEntryPoint.insert(NamedEntryPoint.java:367) 在 org.drools.core.common.NamedEntryPoint.insert(NamedEntryPoint.java:286) 在 org.drools.core.common.NamedEntryPoint.insert(NamedEntryPoint.java:139) 在 monitor.SlidingWindowMapWithEntryPoint$1.run(SlidingWindowMapWithEntryPoint.java:104) 运行(Thread.java:662) 我的代码: 滑动WindowMapWithEntryPoint.javaorg.drools.core.common.DefaultFactHandle不能强制转换为org.drools.core.common.EventFactHandle,drools,drools-fusion,Drools,Drools Fusion,我想用口水做一些警报。吼叫是规则。但是当我启动这个会话时。口水吐出一个例外。谁能告诉我为什么 规则: 例外情况: 线程“thread-0”java.lang.ClassCastException中的异常: 无法将org.drools.core.common.DefaultFactHandle强制转换为 org.drools.core.common.EventFactHandle位于 org.drools.core.reteoo.WindowNode.assertObject(WindowNode
package monitor;
import java.util.Map;
import org.drools.core.impl.InternalKnowledgeBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.EntryPoint;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.zeromq.ZMQ;
import com.alibaba.fastjson.JSON;
public class SlidingWindowMapWithEntryPoint {
private static final String str =
"import java.util.Map\n " +
"declare Map \n"+
" @role(event)\n"+
"end\n"+
"rule \"sliding window time map\" \n" +
"when \n" +
" $m:Map($b:this[\"b\"],$b>10) from entry-point \"MyEntryPoint\"\n" +
" accumulate(Map(this['a']>0 && c >8) over window:time( 1m ) from entry-point \"MyEntryPoint\";$count:count();$count>1 )\n" +
"then \n" +
" System.out.println(\"alarm!!!!\"); \n" +
"end \n";
public static void main(String[] args) {
KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource(str.getBytes()),
ResourceType.DRL );
System.out.println(kbuilder.getErrors());
InternalKnowledgeBase kbase = (InternalKnowledgeBase) KnowledgeBaseFactory.newKnowledgeBase(config);
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
//kiesession
final KieSession ksession = kbase.newKieSession();
new Thread(new Runnable() {
public void run() {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket pull = context.socket(ZMQ.PULL);
pull.connect("tcp://*:5557");
EntryPoint entryPoint = ksession.getEntryPoint("MyEntryPoint");
while (true) {
String ss= pull.recvStr();
if(ss!=null){
Map<String, Object> record=JSON.parseObject(ss, Map.class );
entryPoint.insert(record);
// ksession.insert(record);
}else{
System.out.println(new String("---sssssssssssss---"));
}
}
}
}).start();
//fire!
ksession.fireUntilHalt();
}
}
包装监视器;
导入java.util.Map;
导入org.drools.core.impl.InternalKnowledgeBase;
导入org.kie.api.KieBaseConfiguration;
导入org.kie.api.KieServices;
导入org.kie.api.conf.EventProcessingOption;
导入org.kie.api.io.ResourceType;
导入org.kie.api.runtime.KieSession;
导入org.kie.api.runtime.rule.EntryPoint;
导入org.kie.internal.knowledgebase工厂;
导入org.kie.internal.builder.KnowledgeBuilder;
导入org.kie.internal.builder.KnowledgeBuilderFactory;
导入org.kie.internal.io.ResourceFactory;
导入org.zeromq.ZMQ;
导入com.alibaba.fastjson.JSON;
带有入口点的公共类滑动窗口映射{
私有静态最终字符串str=
“导入java.util.Map\n”+
“声明映射\n”+
“@角色(事件)\n”+
“结束\n”+
“规则\“滑动窗口时间映射\”\n”+
“何时\n”+
$m:Map($b:this[\'b\'],$b>10)从入口点\“MyEntryPoint\”\n“+
“累积(映射(此['a']>0&&c>8)窗口:从入口点\“MyEntryPoint\”;$count:count();$count>1开始的时间(1m)”\n”+
“那么\n”+
“System.out.println(\“alarm!!!!\”);\n”+
“结束\n”;
公共静态void main(字符串[]args){
KieBaseConfiguration config=KieServices.Factory.get().newKieBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);
KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()),
ResourceType.DRL);
System.out.println(kbuilder.getErrors());
InternalKnowledgeBase kbase=(InternalKnowledgeBase)KnowledgeBaseFactory.newKnowledgeBase(配置);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
//基辅会议
final KieSession ksession=kbase.newKieSession();
新线程(newrunnable()){
公开募捐{
ZMQ.Context=ZMQ.Context(1);
套接字拉力=上下文套接字(ZMQ.pull);
pull.connect(“tcp://*:5557”);
EntryPoint EntryPoint=ksession.getEntryPoint(“MyEntryPoint”);
while(true){
字符串ss=pull.recvStr();
如果(ss!=null){
Map record=JSON.parseObject(ss,Map.class);
插入(记录);
//K段.插入(记录);
}否则{
System.out.println(新字符串(“--sssss--”);
}
}
}
}).start();
//开火!
ksession.firuntilhalt();
}
}
Push.java
包装监视器
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.zeromq.ZMQ;
import com.alibaba.fastjson.JSON;
public class Push {
//create an event
public static void main(String args[]) throws InterruptedException {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket push = context.socket(ZMQ.PUSH);
push.bind("tcp://*:5557");
Map<String, Object> mapa = new HashMap<String, Object>();
for (;;) {
Random r=new Random();
int a=r.nextInt(20);
int b=r.nextInt(20);
int c=r.nextInt(20);
mapa.put("a", Integer.valueOf(a));
mapa.put("b", Integer.valueOf(b));
mapa.put("c", Integer.valueOf(c));
boolean res=push.send(JSON.toJSONString(mapa));
System.out.println(res);
Thread.sleep(1000);
}
// push.close();
// context.term();
}
}
import java.util.HashMap;
导入java.util.Map;
导入java.util.Random;
导入org.zeromq.ZMQ;
导入com.alibaba.fastjson.JSON;
公共类推送{
//创建一个事件
公共静态void main(字符串args[])引发InterruptedException{
ZMQ.Context=ZMQ.Context(1);
套接字推送=上下文套接字(ZMQ.push);
push.bind(“tcp://*:5557”);
Map mapa=新的HashMap();
对于(;){
随机r=新随机();
int a=r.nextInt(20);
int b=r.nextInt(20);
int c=r.nextInt(20);
mapa.put(“a”,Integer.valueOf(a));
mapa.put(“b”,Integer.valueOf(b));
mapa.put(“c”,Integer.valueOf(c));
boolean res=push.send(JSON.toJSONString(mapa));
系统输出打印项次(res);
睡眠(1000);
}
//推。关();
//context.term();
}
}
您的DRL文件的语法看起来相当有趣,因此我认为这不是您实际使用的代码。请修复它,确保发布匹配的代码。另外,你如何创造事实,如何插入事实?非常重要:您使用的是哪个Drools版本?在fack中,我不使用drl文件。我使用类似string.cos的规则,我想在运行时更改规则。我已经发布了我编辑的整个java文件。我从zeroMQ套接字接收事实。zeroMQ非常简单。它只是向我推送一个jason格式的映射字符串。这似乎是6.0和6.1中的一个bug。在Drools网站上报告错误报告。我尝试了最新版本6.2.0 final的代码,它仍然存在。那么,这就是错误报告
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.zeromq.ZMQ;
import com.alibaba.fastjson.JSON;
public class Push {
//create an event
public static void main(String args[]) throws InterruptedException {
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket push = context.socket(ZMQ.PUSH);
push.bind("tcp://*:5557");
Map<String, Object> mapa = new HashMap<String, Object>();
for (;;) {
Random r=new Random();
int a=r.nextInt(20);
int b=r.nextInt(20);
int c=r.nextInt(20);
mapa.put("a", Integer.valueOf(a));
mapa.put("b", Integer.valueOf(b));
mapa.put("c", Integer.valueOf(c));
boolean res=push.send(JSON.toJSONString(mapa));
System.out.println(res);
Thread.sleep(1000);
}
// push.close();
// context.term();
}
}