<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Last week I found and fixed a very bad
      bug that seems to fit your case <br>
      <a class="moz-txt-link-freetext" href="https://issues.jboss.org/browse/DROOLS-131">https://issues.jboss.org/browse/DROOLS-131</a><br>
      <br>
      This code should work in 5.6.0-SNAPSHOT and later versions.<br>
      <br>
      I have seen DROOLS-138, but won't be able to work on it before the
      weekend<br>
      <br>
      Davide<br>
      <br>
      On 05/15/2013 11:12 PM, Jason Barto wrote:<br>
    </div>
    <blockquote
cite="mid:CAApekVd8Y9GCfVkTqJ-FLwkgJAS91SiCzXqwH2uf6ZkTwJGOYg@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div>
          <div>
            <div>Wolfgang,<br>
            </div>
            the code to reproduce is below.&nbsp; I'm hoping to process
            between 20k and 50k events through Drools per second thus
            the extreme high-throughput testing.&nbsp; I could settle for a
            single Drools node handling only say 5K per second IFF I
            could cluster Drools but I've not yet found a way to
            distribute workload across an active-active Drools cluster
            (seems there is no such thing?).&nbsp; <br>
            <br>
          </div>
          Since you're recommendation I've shifted to using Drools 5.3
          just FYI:<br>
          <br>
          <br>
        </div>
        <div>### Average.java ###<br>
          package drools53fusioneval;<br>
          <br>
          import java.io.IOException;<br>
          import java.util.Random;<br>
          import org.drools.KnowledgeBase;<br>
          import org.drools.KnowledgeBaseConfiguration;<br>
          import org.drools.KnowledgeBaseFactory;<br>
          import org.drools.builder.KnowledgeBuilder;<br>
          import org.drools.builder.KnowledgeBuilderFactory;<br>
          import org.drools.builder.ResourceType;<br>
          import org.drools.conf.EventProcessingOption;<br>
          import org.drools.io.ResourceFactory;<br>
          import org.drools.runtime.StatefulKnowledgeSession;<br>
          import org.drools.runtime.rule.WorkingMemoryEntryPoint;<br>
          <br>
          class AvgDFEChannel implements org.drools.runtime.Channel {<br>
          <br>
          &nbsp;&nbsp;&nbsp; @Override<br>
          &nbsp;&nbsp;&nbsp; public void send(Object o) {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Recieved channel message: " + o);<br>
          &nbsp;&nbsp;&nbsp; }<br>
          }<br>
          <br>
          public class Average {<br>
          <br>
          &nbsp;&nbsp;&nbsp; public static void main(String[] args) throws
          InterruptedException, IOException {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KnowledgeBaseConfiguration kbconfig =
          KnowledgeBaseFactory.newKnowledgeBaseConfiguration();<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kbconfig.setOption(EventProcessingOption.STREAM);<br>
          <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KnowledgeBase kbase =
          KnowledgeBaseFactory.newKnowledgeBase(kbconfig);<br>
          <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KnowledgeBuilder kbuilder =
          KnowledgeBuilderFactory.newKnowledgeBuilder();<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          kbuilder.add(ResourceFactory.newClassPathResource("drools53fusioneval/basic.drl"),
          ResourceType.DRL);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (kbuilder.hasErrors()) {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          System.err.println(kbuilder.getErrors().toString());<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());<br>
          <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final StatefulKnowledgeSession session =
          kbase.newStatefulKnowledgeSession();<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.registerChannel("heartbeat", new
          AvgDFEChannel());<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkingMemoryEntryPoint ep01 =
          session.getWorkingMemoryEntryPoint("ep01");<br>
          <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Thread() {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.fireUntilHalt();<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }.start();<br>
          <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(5000); // give the engine time to get
          setup<br>
          <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Server hiwaesdk = new Server("hiwaesdk");<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.insert(hiwaesdk);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long LIMIT = 10000;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long sentCount = 0;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int batchSize = 10000;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Random rnd = new Random(System.nanoTime());<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp = 0;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long startTS = System.nanoTime();<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (sentCount &lt; LIMIT) {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; batchSize; i++) {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = rnd.nextInt(212);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntEvent evt = new IntEvent (temp);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ep01.insert(evt);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sentCount++;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep (0x1);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double duration = (System.nanoTime() -
          startTS)/1000000.0;<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(LIMIT +" events generated in "+
          duration +" milliseconds");<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Last temperature submitted: "+
          temp);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 5; i++) {<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println ("Sec "+ i +": "+
          hiwaesdk.currentTemp +", "+ hiwaesdk.readingCount);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep (1000);<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);<br>
          &nbsp;&nbsp;&nbsp; }<br>
          }<br>
          <br>
          <br>
        </div>
        <div>### basic.drl ###<br>
          package drools53fusioneval<br>
          <br>
          declare IntEvent<br>
          &nbsp;&nbsp;&nbsp; @role ( event )<br>
          end<br>
          <br>
          rule "number rule"<br>
          when<br>
          &nbsp;&nbsp;&nbsp; $e : IntEvent () from entry-point ep01<br>
          &nbsp;&nbsp;&nbsp; $s : Server (hostname == "hiwaesdk")<br>
          then<br>
          &nbsp;&nbsp;&nbsp; $s.currentTemp = $e.data;<br>
          &nbsp;&nbsp;&nbsp; $s.readingCount++;<br>
          end<br>
          <br>
          <br>
        </div>
      </div>
      <div class="gmail_extra">
        <br>
        <br>
        <div class="gmail_quote">On Thu, May 16, 2013 at 4:25 AM,
          Wolfgang Laun <span dir="ltr">&lt;<a moz-do-not-send="true"
              href="mailto:wolfgang.laun@gmail.com" target="_blank">wolfgang.laun@gmail.com</a>&gt;</span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            What you describe is definitely not "expected behaviour" -
            it's more<br>
            like that race condition (or another one) already being in
            5.3. Posting<br>
            your code might be a good idea ;-)<br>
            -W<br>
            <div>
              <div class="h5"><br>
                On 16/05/2013, Jason Barto &lt;<a moz-do-not-send="true"
                  href="mailto:jason.p.barto@gmail.com">jason.p.barto@gmail.com</a>&gt;
                wrote:<br>
                &gt; I've been working to load test Drools 5.3 to
                determine if its a fit for a<br>
                &gt; project. &nbsp;As part of the test I programmatically
                insert events as rapidly<br>
                &gt; as possible; an example, my earlier test inserted
                10k events in about<br>
                &gt; 300ms. &nbsp;There is currently a single rule which
                reads the event and stores<br>
                &gt; the event's value into the only fact in Drools. I'm
                very happy to report,<br>
                &gt; and I'm sure it will be no surprise to anyone, that
                the engine processes<br>
                &gt; all the events in roughly 1 sec. However I have
                noticed that any large<br>
                &gt; number of events (~&gt;1000) usually sees that a
                small number of events don't<br>
                &gt; get processed. I think after 10k events as many as
                7 appear to have gone<br>
                &gt; unprocessed. If 100 events are inserted, rather
                than 10k, no events get<br>
                &gt; disregarded. &nbsp;Being new to Drools I can easily
                accept that my java code or<br>
                &gt; DRL code is off or unoptimized in some way. However
                not knowing how Drools<br>
                &gt; does its magic I'm currently inclined to think that
                Drools gets swamped<br>
                &gt; (10k in 300ms is a lot) and a few events get
                dropped so Drools can keep<br>
                &gt; operating. Is this a known or expected behavior
                from Drools? If not I am<br>
                &gt; happy to post my code, it is similar to the other
                code sets I've posted in<br>
                &gt; the last few days. I'm still new to Drools and
                trying to learn its behavior<br>
                &gt; so any insight or enlightenment is greatly
                appreciated.<br>
                &gt;<br>
                &gt; Sincerely,<br>
                &gt; Jason<br>
                &gt;<br>
              </div>
            </div>
            _______________________________________________<br>
            rules-users mailing list<br>
            <a moz-do-not-send="true"
              href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
            <a moz-do-not-send="true"
              href="https://lists.jboss.org/mailman/listinfo/rules-users"
              target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
          </blockquote>
        </div>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
rules-users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/rules-users">https://lists.jboss.org/mailman/listinfo/rules-users</a></pre>
    </blockquote>
    <br>
  </body>
</html>