5 Replies Latest reply on Jan 17, 2012 4:34 AM by sebb

    How to suspend and resume a process?

    sebb Newbie

      Hi

       

      I'd like to know how to suspend and resume a process with jbpm 5. I am used to this feature due to usage of bpel. While trying to search google and the forums for this topic I only came across this feature in relation with jbpm 4.

       

      Another question that comes to my mind: Can you force session.startProcess() to return immediately, even if the first node is not a async workitem?

        • 1. Re: How to suspend and resume a process?
          Esteban Aliverti Master

          In jBPM5 you can't manually suspend a process. Processes are automatically suspended when, during its execution, they reach a wait-state (nothing else to execcute). This could be the case of async Tasks, Events, Rule Execution, etc. Resuming the process execution depends on what is the process waiting for:

          • ksession.signalEvent() -> if the process is suspended in a event
          • ksession.getWorkItemManager().completeWorkItem() -> if the process is suspended in an async Task
          • using Human Task Client API -> if the process is suspended in a Human Task
          • ksession.fireAllRules() -> if the process is suspended in a Rule Task node.

           

          Regarding your last question, why do you need startProcess() to return immediately? If what you need is the id of the process, then you can separate startProcess() in:

          1. ksession.createProcessInstance() -> creates an instance and persists it in the db
          2. ksession.startProcessInstance() -> actually starts the execution of the process instance.
          1 of 1 people found this helpful
          • 2. Re: How to suspend and resume a process?
            sebb Newbie

            Thanks for the quick reply

             

            Yes, I needed the instanceId and the state of a processInstance. I think that will help.

             

            Nevertheless I am quite disappointed about the first answer. We have a scenario where processes have different priorieties and relations (for example process A cant run while process B is active). Therefor it should be possible to suspend a whole process, so that a process with a higher priority can run. I guess most of the time it's a problem of the workitems. When a process is paused the workitems (long running async items) have to be paused too and that will also somehow suspend the process (like your second example). But what happens when the process should be paused just in the milliseconds between two nodes (not very common, but If there is a timer between two nodes it would be quite probable)? In this case there would be no workitem that i can suspend manually to suspend the whole process and that way the process would just go on after the timer stopped.

             

            Any thoughts about my scenario? Can you think of other examples (like the timer) where an external pause/resume would not work?

            • 3. Re: How to suspend and resume a process?
              Esteban Aliverti Master

              AFAIK, there is no easy solution for your scenario. Maybe someone else in this forum that has already faced this problem could help you

               

              Best Regards,

              • 4. Re: How to suspend and resume a process?
                Chris Melas Apprentice

                Hello,

                 

                sebb wrote:

                 

                ... We have a scenario where processes have different priorieties and relations (for example process A cant run while process B is active). Therefor it should be possible to suspend a whole process, so that a process with a higher priority can run. I guess most of the time it's a problem of the workitems. When a process is paused the workitems (long running async items) have to be paused too and that will also somehow suspend the process (like your second example). But what happens when the process should be paused just in the milliseconds between two nodes (not very common, but If there is a timer between two nodes it would be quite probable)? In this case there would be no workitem that i can suspend manually to suspend the whole process and that way the process would just go on after the timer stopped.

                 

                Any thoughts about my scenario? Can you think of other examples (like the timer) where an external pause/resume would not work?

                 

                In order to manage the way different types of processes  (i.e. type A - low priority, type B - high priority etc) are run, i suggest the following concept of an approach which involves a little custom work,

                 

                1. A small infrastructure for actually pausing any process before executing a work item. This can be achieved by initialy associating some kind of flag with each process started. Then create a central base abstract work item handler, which all your work items will extend, having a logic at the start of each executeWorkItem(..) method where a check to the flag would take place. If the flag is up then the execution continues, else if the flag is down it sits there and waits until the flag is up. Of course this will have to run asynchronously within a new thread at least for two reasons a. so not to block the engine b. to persist and continue all processes if the engine goes down at any point. This way you will be able to pause processes at the start of a work item. You will not be able to pause a process while running a work item's logic, unless you place appropriate logic of persisting state at any point of execution, then resuming everything etc, this is hard, not very efficient (well depending on the work done at each instant of time on each work item of each process) and error prone.

                 

                2. An object acting as a controller containing all the business logic related to priorities and relations of processes. This controller would decide whether a process has to be paused or resumed etc by raising or lowering the flag of the running processes. The controller would probably run when starting each process, in order to decide what to do with the other processes running or the current process etc.

                • 5. Re: How to suspend and resume a process?
                  sebb Newbie

                  Hi,

                   

                  thats a great idea and I think it will work for most cases. Thanks