[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