[rules-users] Drools Flow: waiting for process to complete without polling

Alexandros Karypidis akarypid at yahoo.gr
Thu Oct 1 14:18:41 EDT 2009


Hello Kris,

Thank you for your reply.

I am currenty doing "test-driven" development outside an application 
server to learn the API. I launch processes from within a unit test 
method; hence my need to wait in this manner so that I can perform a 
final assertion on process state (after the process is complete).

You are totally correct to point out that in real life, I will be 
executing long-running processes from within JBoss in my application 
across multiple executions of the application. So what is the typical 
approach for doing that? Do you typically install Drools as a service in 
a SAR, or do you launch it with a servlet startup listener when the WAR 
starts? Also, how do you make sure a clean undeploy/shutdown occurs 
where process execution is gracefully suspended and process states are 
saved? Can you give me some pointers?

Thank you.

Kris Verlaenen wrote:
> I'm not sure that having a thread wait like this until all processes
> have completed is a good idea in general, as in theory processes could
> run for a long time (hours/days/weeks/...).  Unless of course you are
> only using synchronous processes, but in that case the engine will only
> return once the process has been completed anyway (if you call it
> synchronously).
>
> But the approach you suggest is valid, you can register an event
> listener to react whenever a process instance is completed, or similarly
> you could use the history log to retrieve this kind of information
> (making it decoupled from the actual execution).
>
> Kris
>
> Quoting Alexandros Karypidis <akarypid at yahoo.gr>:
>
>   
>> Hello,
>>
>> I'm not very experienced in the Drools Flow API so I'm looking into
>> the 
>> best way to code a simple thing: wait for all processes in a session
>> to 
>> complete without polling.
>>
>> The only way I could thing of from the javadoc reference I read, is
>> to 
>> synchronize and do a wait()/notify() using a ProcessEventListener. It
>>
>> seems a lot of work for a use-case that is too basic. I set up a 
>> listener like this:
>>
>>     pel = new ProcessEventListener() {
>>        // ...
>>             public void afterProcessCompleted(ProcessCompletedEvent
>> pce) {
>>                 synchronized (this) {
>>                     notifyAll();
>>                 }
>>             }
>>     }
>>     ksession.addEventListener(pel);
>>
>> ...then wait for processes (one in this simplified case) to complete
>>
>> like this:
>>
>>     synchronized (pel) {
>>         new Thread(new Runnable() {
>>             public void run() {
>>                 ksession.fireUntilHalt();
>>             }
>>         }).start();
>>         ksession.startProcess("some.process");
>>         pel.wait(); // the notifyAll() resumes this
>>     }
>>
>> Is there a better way to do this?
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
>>     




More information about the rules-users mailing list