7 Replies Latest reply on Aug 14, 2009 11:12 AM by kukeltje

    how to start job executor

    armita

      How can I start jobExecutor and configure it in jbpm4? Does it starts automatically or should I start manually?

        • 1. Re: how to start job executor
          shiyeling

          I imported the job executor configuration file to the jbpm config.

           <import resource="jbpm.jobexecutor.cfg.xml" />
          


          but it do not start automatically when the program runs.

          I found the code to start it programmatically from the JobExecutorThread class.

          But, do we have to do this?

          • 2. Re: how to start job executor
            jbarrez

            Adding the import to you jbpm.cfg.xml should do the trick. How are you testing the job executor?

            • 3. Re: how to start job executor
              shiyeling

              I'm using a Java class with a main method to test the job executor.
              I start a thread parse command line from console and invoke jbpm execution services.

              The behavior is:
              Job executor does not start with process engine,
              But when I create new process instance which has timer defined, it starts automatically.

              FYI.
              I looked up the source code, found the problem might be:
              in JbpmConfiguration

              protected WireContext processEngineWireContext = new WireContext(new WireDefinition(), Context.CONTEXTNAME_PROCESS_ENGINE);
              

              configuration object have a WireContext object created before parsing any configuration, and the WireContext will do:
               initializeEagerObjects();
               fire(EVENT_OPEN, null);
              

              when it is created. But, at that time, there is not configuration file parsed so eager initialization won't have anything to do.

              When user try to schedule a job( timer) and open a new Environment, the eager initialize method is invoked in runtime.


              Currently we could start the job executor with the servlet or a spring initializing bean.

              • 4. Re: how to start job executor

                I'm seeing exactly the same behaviour using this code:

                ProcessEngine processEngine=new Configuration().setResource("my.jbpm.cfg.xml").buildProcessEngine();
                RepositoryService repositoryService = processEngine.getRepositoryService();
                ExecutionService executionService = processEngine.getExecutionService();
                


                my.jbpm.cfg.xml:

                <jbpm-configuration>
                <import resource="jbpm.default.cfg.xml"/>
                <import resource="jbpm.tx.hibernate.cfg.xml"/>
                <import resource="jbpm.jpdl.cfg.xml"/>
                <import resource="jbpm.jobexecutor.cfg.xml" />
                </jbpm-configuration>
                


                On startup the timers are not fired, however the moment I execute this line of code:

                String id=executionService.startProcessInstanceByKey(workflowName,ParameterHelper.getParameters(parameters)).getId();
                


                All the timers that were stored up in the DB fire.

                My current nasty hack is to have a dummy with this code (doing one without a timer doesn't work either):

                <process name="Dummy" xmlns="http://jbpm.org/4.0/jpdl">
                <start name="a">
                <transition to="b"/>
                </start>
                <state name="b">
                <transition to="c" name="toc">
                <timer duedate="1 second" />
                </transition>
                </state>
                <end name="c"/>
                </process>
                


                And the line:

                executionService.startProcessInstanceByKey("Dummy");
                


                In the main.

                Does anyone know if we're doing something wrong, or if this should be reported as a bug?

                Thanks!

                - Kit

                • 5. Re: how to start job executor
                  shiyeling

                  Instead of starting a dummy workflow, you can tell the jobExecutor to start programatically. The following code is from JobExecutorServlet.

                   EnvironmentFactory environmentFactory = (EnvironmentFactory) new Configuration().setResource(configurationResource).buildProcessEngine();
                   jobExecutor = environmentFactory.get(JobExecutor.class);
                   if (jobExecutor==null) {
                   throw new JbpmException("no job executor configured in resource "+configurationResource);
                   }
                   jobExecutor.start();
                  


                  you can do this any where you can get the process engine object.
                  Servlet for web apps or spring initializing bean.

                  • 6. Re: how to start job executor
                    marcel.de.koster

                    I also added the programmatic timer start using the TaskExecuter via the ProcessEngine interface (you do not need to cast to a specific class).

                    But shouldn't it be possible to do this:

                    <bpm-configuration>
                    ...
                    <process-engine-context>
                    ...
                    <job-executor auto-start="true" />
                    </process-engine-context>

                    ...
                    </jbpm-configuration>

                    For me the above code doesn't work. Only programmatic starting of job executor.

                    • 7. Re: how to start job executor
                      kukeltje

                      Technically yes (to a certain extend), practically no (due to the limitations of this 'certain extend')

                      Shiyeling menthioned them already: Many usecases of using jBPM in different environments. e.g. you cannot start a thread from a normal class in many appservers, you needs startup servlets for this..