1

I want to use drools do some alarm.bellow is the rule .but when i fire the kieSession. drools throws an excetption. who can tell me why?

rule:

import   java.util.Map /n
declare Map 
  @role(event)
end

rule "sliding window time map" 

when
    $m:Map($b:this[\b\],$b>10) from entry-point \MyEntryPoint\
    accumulate(Map(this['a']>0  && c >8) over window:time( 1m ) from entry-point \MyEntryPoint\;$count:count();$count>1 )  
then
    System.out.println("alarm!!!!");
end 

excetption:

Exception in thread "Thread-0" java.lang.ClassCastException: org.drools.core.common.DefaultFactHandle cannot be cast to org.drools.core.common.EventFactHandle at org.drools.core.reteoo.WindowNode.assertObject(WindowNode.java:168) at org.drools.core.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:502) at org.drools.core.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:387) at org.drools.core.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:288) at org.drools.core.reteoo.EntryPointNode.assertObject(EntryPointNode.java:251) at org.drools.core.common.NamedEntryPoint.insert(NamedEntryPoint.java:367) at org.drools.core.common.NamedEntryPoint.insert(NamedEntryPoint.java:286) at org.drools.core.common.NamedEntryPoint.insert(NamedEntryPoint.java:139) at monitor.SlidingWindowMapWithEntryPoint$1.run(SlidingWindowMapWithEntryPoint.java:104) at java.lang.Thread.run(Thread.java:662)

My code:

SlidingWindowMapWithEntryPoint.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();

      }
}

Push.java

package monitor;

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();  
    }  
}
doctor CUI
  • 11
  • 2
  • 5
  • The syntax of your DRL file looks rather funny, so I don't think this is the code you have actually been using. Please fix it, making sure to post matching code. Also, how do you create the facts and how do you insert them? Very important: which Drools version are you using? – laune Mar 28 '15 at 11:10
  • in fack ,I do not use drl file.I use rule like string.cos I want to change the rule at runtime. I hava post the whole java file I edit. I receive the fact from a zeroMQ socket. zeroMQ is very simple.It just push a jason format string of Map to me。 – doctor CUI Mar 30 '15 at 02:10
  • This appears to be a bug in 6.0 and 6.1. Report it on the Drools site for bug reporting. – laune Mar 30 '15 at 08:30
  • I try the code with the latest release version 6.2.0 final,it still exists. – doctor CUI Mar 31 '15 at 03:29
  • Well, then: it's bug reporting. – laune Mar 31 '15 at 05:44
  • I have report it ,see https://issues.jboss.org/browse/DROOLS-753 – doctor CUI Apr 17 '15 at 07:58

1 Answers1

0

You may need to also declare Map types, that are coming through the entry point, as events, e.g.:

declare HashMap 
  @role(event)
end
declare LinkedHashMap 
  @role(event)
end 
Radoslav Ivanov
  • 970
  • 8
  • 23