I have one BPEL process for originating customers' loan which usually involves various steps which takes around 15-20 mins to complete per instance. I would like to implement a user interface that can check the process's progress and display how it is going to the user.
I have thought of using an asynchronous process that updates a global variable listing status of each step inside the process and use a poller to invoke another operation (like "checkStatus" operation) of this process to retrieve this variable and display the value to the users. It may be achieved by using "OnEvent" activity waiting for "checkStatus" operation. It will run in parallel with the main process, have access to the global variable and reply this variable immediately to the caller.
It sounds like an idea in theory but invoking a web service operation for polling status is very heavy-weight and may impact performance during high-load.
I am just wondering if there is other solution to this problem as I believe the status checking is a very common expected requirement in long-running BPEL process. What might be the best practice to implement this?
I apologize for the slow reply. I am just back from overseas and did not have chance to go to the forum!
Thank you a lot for your responses!
The BAM looks like a suggested out-of-the-box solution. But it ties too much to Oracle API and will be hard to customise the way you want to interpret the status to end-users. If you want to display the process status with BAM in a web application interface, ADF is the only solution (please correct me if I am wrong). I would prefer a stand-alone, free of proprietary API solution so that we can build a screen that is technology-independent. As ADF UI is not our only supported view technology. For example, a PHP web client should be able to interpret the BPEL process status.
Otherwise we can have a java application which is collecting all those required information in your bpel and with that help we can build a web application.
We need to consider about the performance of the main process as we will be using lots of variables, irrespective of whether its failure or success.
We have to have block which mark all the variables null before exiting the process.
Thanks everyone for the ideas, I really appreciate.
We have designed our own approach, in our architecture, after BPEL invokes a service endpoint, the endpoint will update a few dedicated database tables. By emulating asynchronous invocation using Java thread (1 thread to invoke synchronous BPEL process, 1 thread to keep polling the database for displaying to the users). When the response from BPEL arrives in 1 thread, we notify (using callback) the other thread to stop polling and direct users to result page. This approach is API independent and it can support any type of client. The rationale is instead of hooking into SOA database, we 'd rather extend our own database to support the approach.