Hi,
I'm facing a similar issue. We need to process 100's of groups of files. Each
file group results in the creation of a process instance. Each process has a
number of steps. Some of these steps take 10's of minutes or hours to process.
Therefore we are using the embedded async continuation method to allow for
nodes to be processed in parallel to leverage our multi-cpu system. When a new
job is created for each async node, it is given a due date of the current
system time.
| See Node.createAsyncContinuationJob:
|
| protected ExecuteNodeJob createAsyncContinuationJob(Token token) {
| ExecuteNodeJob job = new ExecuteNodeJob(token);
| job.setNode(this); job.setDueDate(new Date());
job.setExclusive(isAsyncExclusive);
| return job;
| }
The job executor thread acquires jobs based on the results of a querying the
JBPM_JOB table and sorting by due date. The JobExecutorThread acquires jobs by
calling JobSession.getFirstAcquirableJob() which executes the query below.
Note the results are ordered by due date.
|
| <query name="JobSession.getFirstAcquirableJob">
| <![CDATA[
| select job
| from org.jbpm.job.Job as job
| where ( (job.lockOwner is null) or (job.lockOwner = :lockOwner) )
| and job.retries > 0
| and job.dueDate <= :now
| and job.isSuspended != true order by job.dueDate asc ]]>
| </query>
Essentially async nodes are processed in the order in which they were created,
this is completely different than the order in which the process instances
where created. This essentially means that all the early nodes of all
processes instances are executed before the later nodes of the first process
instance. i.e. I would really like the job executor to work on nodes
associated with the first process instance before working on nodes associated
with subsequent process instances. i.e. if possible complete ready process
instance 1 jobs before working on process instance 2 jobs.
Options I'm considering:
| 1. Modify Node.createAsyncContinuationJob() to use the create date of the
processes instance for the job due date rather than just using new Date();
| 2. Creating my own sub class of org.jbpm.job to add in another member that
saves my priority and modify the JobSession.getFirstAcquirableJob query
accordingly
| 3. Modifying the JobSession.getFirstAcquirableJob query to order the list
by process instance ID first and then due date. At the moment this seems like
the most straight forward approach and doesn't require me to modify or extend
jBPM code or modify the schema.
|
|
| Anyone have other ideas?
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4091172#4091172
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4091172
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user