Edson,

I was under the impression that this:

declare ReconfigEvent
    @role( event )
    @expires ( 5s )
end

would cover that, meaning that every ReconfigEvent would expire after 5s, thus causing to no longer be needed by the engine.

Thanks,
Chris

On 7/25/2011 12:17 PM, Edson Tirelli wrote:

   Chris,

I haven't tried your code, but just looking at the rule, there is no temporal correlation between DataReading and ReconfigEvent, so if I am not mistaken, that will create a required interval of infinite time when the temporal reasoning is applied, meaning the engine has to keep the readings in memory forever.

Adding a temporal constraint on the ReconfigEvent pattern on your rule or defining an explicit expiration policy for the DataReadings are ways to work around that.

   Edson

2011/7/26 Chris Richmond <crichm...@referentia.com <mailto:crichm...@referentia.com>>

    Hello

    I am performing a simple test of injecting an event every 1
    millisecond
    like so:

          for (int x = 0; x < 100000; x++){
            DataReading dr = new DataReading("Reading " + x, 12.0f);
            myStream.insert(dr);
            ksession.fireAllRules();
            Thread.sleep(1);

          }


    The rule that evaluates this is simple.  It basically delays
    "then" for
    3s to see if a followup reading is inserted and makes sure that no
    ReconfigEvent is active(5s expiration).

    So if a reading comes in and a followup reading is not inserted
    within 3
    seconds and there is is not an existing ReconfigEvent event alive,
    then
    it should output and insert a ReconfigEvent, essentially disabling any
    DataReading action on those events for the next 5 seconds or so.  This
    all works just fine as expected.

    My question is, how come I don't get memory back when all 100,000
    of my
    events have been inserted.  Memory goes up slowly over the course of
    insertions, which I can understand, but once that loop is finished,
    memory never reduces, so essentially, the application will eventually
    run out of memory after some time.   I should not have to explicitly
    remove/retract events should I? Shouldn't they be removed from working
    memory as soon as they are no longer viable?  What should I be
    doing to
    reclaim memory from the session/knowledgebase?

    I have included the full Main program here and the Sample.drl file
    below it.

    ************FusionMain.java*****************

    package com.sample;

    import org.drools.KnowledgeBase;
    import org.drools.KnowledgeBaseConfiguration;
    import org.drools.KnowledgeBaseFactory;
    import org.drools.builder.KnowledgeBuilder;
    import org.drools.builder.KnowledgeBuilderError;
    import org.drools.builder.KnowledgeBuilderErrors;
    import org.drools.builder.KnowledgeBuilderFactory;
    import org.drools.builder.ResourceType;
    import org.drools.conf.EventProcessingOption;
    import org.drools.io.ResourceFactory;
    import org.drools.logger.KnowledgeRuntimeLogger;
    import org.drools.logger.KnowledgeRuntimeLoggerFactory;
    import org.drools.runtime.KnowledgeSessionConfiguration;
    import org.drools.runtime.StatefulKnowledgeSession;
    import org.drools.runtime.conf.ClockTypeOption;
    import org.drools.runtime.rule.WorkingMemoryEntryPoint;


    public class FusionMain {

      @SuppressWarnings("restriction")
      public static void main(String[] args) {


        try {

          KnowledgeSessionConfiguration config =
    KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
          config.setOption( ClockTypeOption.get("realtime") );


          KnowledgeBase kbase;
          kbase = readKnowledgeBase();
          StatefulKnowledgeSession ksession =
    kbase.newStatefulKnowledgeSession();

          WorkingMemoryEntryPoint myStream =
    ksession.getWorkingMemoryEntryPoint("My Stream");

          for (int x = 0; x < 100000; x++){
            DataReading dr = new DataReading("Reading " + x, 12.0f);
            myStream.insert(dr);
            ksession.fireAllRules();
            Thread.sleep(1);

          }

        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }

      }

      @SuppressWarnings("restriction")
      private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder =
    KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),
    ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
          for (KnowledgeBuilderError error: errors) {
            System.err.println(error);
          }
          throw new IllegalArgumentException("Could not parse
    knowledge.");
        }

        KnowledgeBaseConfiguration kbConfig =
    KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
        kbConfig.setOption( EventProcessingOption.STREAM );
        KnowledgeBase kbase =
    KnowledgeBaseFactory.newKnowledgeBase(kbConfig);
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());


        return kbase;
      }


    }


    *********Sample.drl*************************

    package com.sample


    import java.util.Date;

    declare DataReading
        @role( event )
    end


    declare ReconfigEvent
        @role( event )
        @expires ( 5s )
    end



    rule "Wait for follup reading or no config"
    //lock-on-active
    when

        $dr: DataReading(reading > 10.0) from entry-point "My Stream"
        not(DataReading(reading < 10.0, this after[0s,3s] $dr) from
    entry-point "My Stream")
        not(ReconfigEvent() from entry-point "My Stream")

    then
        System.err.println("Action: " + new
    Date(System.currentTimeMillis()));
        System.err.println("Data reading " + $dr.getName() + " > 10");
        ReconfigEvent rce = new ReconfigEvent();
        entryPoints["My Stream"].insert( rce );

    end






    _______________________________________________
    rules-users mailing list
    rules-users@lists.jboss.org <mailto:rules-users@lists.jboss.org>
    https://lists.jboss.org/mailman/listinfo/rules-users




--
  Edson Tirelli
  JBoss Drools Core Development
  JBoss by Red Hat @ www.jboss.com <http://www.jboss.com>


_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to