[rules-users] Pooling stateful sessions to have threaded executions of a ruleset

Mark Proctor mproctor at codehaus.org
Sun Apr 13 16:42:44 EDT 2014


as it says in the docs. we’ve designed things to put in foundations for future multi-threaded exploitation, but there is nothing there now.

The  example code doesn’t make too much sense to me. As you are saying you are using them as a pool, but you are disposing after use.

Mark
On 11 Apr 2014, at 08:48, Mercier Jonathan <jmercier at genoscope.cns.fr> wrote:

> Le 09/04/2014 11:20, Maxime Falaize a écrit :
>> I confirm that the multithreaded rules evaluation is not currently supported. See https://github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/RuleBaseConfiguration.java#L683
>> 
>> 
>> 2014-04-07 12:27 GMT+02:00 Maxime Falaize <maxime.falaize at gmail.com>:
>> I'm sorry but I don't understand what you are talking about. In this article, there is nothing about multithreaded rules evaluation. It just says that the Phreak algorithm is designed for thread safety and future multicore processors exploitation. It doesn't mean that it is already multithreaded. Moreover I tested my appliciation with and without multithreaded sessions (I am using Drools 6.0.1.Final) and I noted a faster execution in the multithreaded one.
>> 
>> 
>> 2014-04-04 13:53 GMT+02:00 jmercier <jmercier at genoscope.cns.fr>:
>> 
>> Le 04/03/2014 09:55, Maxime Falaize a écrit :
>> > Hello,
>> >
>> > I want to ask you if it is a good practive to pool stateful sessions
>> > for a specific ruleset to improve the execution performance.
>> > Actually in my application I execute my rules by calling SOAP
>> > webservice. For performance purpose, I test multithreaded calls to my
>> > webservice and I noted that when I pool sessions in the server side,
>> > it improves the performance a lot.
>> >
>> > To pool sessions, I just declare multiple ksession tag in my
>> > kmodule.xml :
>> >
>> > <kbase name="KBase" packages="com.example.*">
>> >         <ksession name="KSession1"/>
>> >          <ksession name="KSession2"/>
>> >         <ksession name="KSession3"/>
>> >         <ksession name="KSession4"/>
>> >         <ksession name="KSession5"/>
>> >  </kbase>
>> >
>> > In my spring webservice endpoint I just put that code to handle the
>> > pool :
>> >
>> > @Endpoint
>> > public class ExampleEndpoint implements InitializingBean {
>> >
>> >     @Autowired
>> >     private ExampleRuleService ruleService;
>> >      private Map<Integer, Boolean> isRunningMap = new
>> > HashMap<Integer, Boolean>();
>> >     private static final int NB_POOL_SESSIONS = 5;
>> >
>> >     @PayloadRoot(localPart = "com.example.ExampleRequest")
>> >      @ResponsePayload
>> >     public ExampleResponse handleRequest(
>> >             @RequestPayload ExampleRequest request) throws
>> > InterruptedException {
>> >         KieServices ks = KieServices.Factory.get();
>> >         KieContainer kc = ks.getKieClasspathContainer();
>> >          while (true) {
>> >             for (int i = 0; i < NB_POOL_SESSIONS; i++) {
>> >                 boolean run = false;
>> >
>> >                 synchronized (isRunningMap) {
>> >                     if (!isRunningMap.get(i)) {
>> >                          isRunningMap.put(i, true);
>> >                         run = true;
>> >                     }
>> >                 }
>> >
>> >                 if (run) {
>> >                     KieSession ksession = kc.newKieSession("KSession"
>> > + (i + 1));
>> >                      ExampleResponse response =
>> > ruleService.run(ksession, request);
>> >                     ksession.dispose();
>> >
>> >                     isRunningMap.put(i, false);
>> >                     return response;
>> >                  }
>> >             }
>> >             Thread.sleep(100);
>> >         }
>> >     }
>> >
>> >     public void afterPropertiesSet() throws Exception {
>> >         for (int i = 1; i <= NB_POOL_SESSIONS; i++) {
>> >             isRunningMap.put((i - 1), false);
>> >          }
>> >     }
>> >
>> > }
>> >
>> > It works well because in my benchmark I improve 5 times the
>> > performance (as I have 5 different threads) but I wondered if it is a
>> > good practice and if it does not hide any issues that I could have in
>> > the future.
>> >
>> > Thanks for your help.
>> >
>> > --
>> > Maxime FALAIZE
>> > _______________________________________________
>> > rules-users mailing list
>> > rules-users at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> 
>> 
>> Hi maxime,
>> 
>> I do not remember if use drools 6 or drools 5. If you using drools 6.
>> Phreaks algorithm use multi threading according to use 'from
>> accummulate' far i understand here:
>> http://planet.jboss.org/post/drools_6_performance_with_the_phreak_algorithm
>> 
>> Instead to put a thread by ksession here rules evaluation are
>> multi-threaded.
>> 
>> 
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
>> 
>> 
>> -- 
>> Maxime FALAIZE
>> 
>> 
>> 
>> -- 
>> Maxime FALAIZE
>> 
>> 
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> Ah yes. Maybe Mark Proktor could tell  some information about this
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20140413/63e3c782/attachment-0001.html 


More information about the rules-users mailing list