org.drools.core.common.DefaultFactHandle不能强制转换为org.drools.core.common.EventFactHandle

org.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

我想用口水做一些警报。吼叫是规则。但是当我启动这个会话时。口水吐出一个例外。谁能告诉我为什么

规则:

例外情况:

线程“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.java

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();  
    }  
}