protected internal virtual AcquiredJobs acquireJobs(JobAcquisitionContext context, JobAcquisitionStrategy acquisitionStrategy, ProcessEngineImpl currentProcessEngine) { CommandExecutor commandExecutor = currentProcessEngine.ProcessEngineConfiguration.CommandExecutorTxRequired; int numJobsToAcquire = acquisitionStrategy.getNumJobsToAcquire(currentProcessEngine.Name); AcquiredJobs acquiredJobs = null; if (numJobsToAcquire > 0) { jobExecutor.logAcquisitionAttempt(currentProcessEngine); acquiredJobs = commandExecutor.execute(jobExecutor.getAcquireJobsCmd(numJobsToAcquire)); } else { acquiredJobs = new AcquiredJobs(numJobsToAcquire); } context.submitAcquiredJobs(currentProcessEngine.Name, acquiredJobs); jobExecutor.logAcquiredJobs(currentProcessEngine, acquiredJobs.size()); jobExecutor.logAcquisitionFailureJobs(currentProcessEngine, acquiredJobs.NumberOfJobsFailedToLock); LOG.acquiredJobs(currentProcessEngine.Name, acquiredJobs); return(acquiredJobs); }
public virtual void run() { lock (this) { LOG.startingToAcquireJobs(jobExecutor.Name); JobAcquisitionStrategy acquisitionStrategy = initializeAcquisitionStrategy(); while (!isInterrupted) { acquisitionContext.reset(); acquisitionContext.AcquisitionTime = DateTimeHelper.CurrentUnixTimeMillis(); IEnumerator <ProcessEngineImpl> engineIterator = jobExecutor.engineIterator(); try { while (engineIterator.MoveNext()) { ProcessEngineImpl currentProcessEngine = engineIterator.Current; if (!jobExecutor.hasRegisteredEngine(currentProcessEngine)) { // if engine has been unregistered meanwhile continue; } AcquiredJobs acquiredJobs = acquireJobs(acquisitionContext, acquisitionStrategy, currentProcessEngine); executeJobs(acquisitionContext, currentProcessEngine, acquiredJobs); } } catch (Exception e) { LOG.exceptionDuringJobAcquisition(e); acquisitionContext.AcquisitionException = e; } acquisitionContext.JobAdded = isJobAdded; configureNextAcquisitionCycle(acquisitionContext, acquisitionStrategy); //The clear had to be done after the configuration, since a hint can be //appear in the suspend and the flag shouldn't be cleaned in this case. //The loop will restart after suspend with the isJobAdded flag and //reconfigure with this flag clearJobAddedNotification(); long waitTime = acquisitionStrategy.WaitTime; // wait the requested wait time minus the time that acquisition itself took // this makes the intervals of job acquisition more constant and therefore predictable waitTime = Math.Max(0, (acquisitionContext.AcquisitionTime + waitTime) - DateTimeHelper.CurrentUnixTimeMillis()); suspendAcquisition(waitTime); } LOG.stoppedJobAcquisition(jobExecutor.Name); } }
public virtual void submitAcquiredJobs(string engineName, AcquiredJobs acquiredJobs) { acquiredJobsByEngine[engineName] = acquiredJobs; }
protected internal virtual void executeJobs(JobAcquisitionContext context, ProcessEngineImpl currentProcessEngine, AcquiredJobs acquiredJobs) { // submit those jobs that were acquired in previous cycles but could not be scheduled for execution IList <IList <string> > additionalJobs = context.AdditionalJobsByEngine[currentProcessEngine.Name]; if (additionalJobs != null) { foreach (IList <string> jobBatch in additionalJobs) { LOG.executeJobs(currentProcessEngine.Name, jobBatch); jobExecutor.executeJobs(jobBatch, currentProcessEngine); } } // submit those jobs that were acquired in the current cycle foreach (IList <string> jobIds in acquiredJobs.JobIdBatches) { LOG.executeJobs(currentProcessEngine.Name, jobIds); jobExecutor.executeJobs(jobIds, currentProcessEngine); } }
public virtual void acquiredJobs(string processEngine, AcquiredJobs acquiredJobs) { logDebug("022", "Acquired {} jobs for process engine '{}': {}", acquiredJobs.size(), processEngine, acquiredJobs.JobIdBatches); }