Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2012 International Business Machines Corp.
   * 
   * See the NOTICE file distributed with this work for additional information
   * regarding copyright ownership. Licensed under the Apache License, 
   * Version 2.0 (the "License"); you may not use this file except in compliance
   * with the License. You may obtain a copy of the License at
   * 
   *   http://www.apache.org/licenses/LICENSE-2.0
  * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.ibm.jbatch.container.impl;
 
 import java.util.List;
 
 
 
 public abstract class JobThreadRootControllerImpl implements IThreadRootController {
 
 	private final static String CLASSNAME = JobThreadRootControllerImpl.class.getName();
 	private final static Logger logger = Logger.getLogger();
 
 	protected long rootJobExecutionId;
 	protected long jobInstanceId;
 	private ListenerFactory listenerFactory = null;
 
 	protected final ModelNavigator<JSLJobjobNavigator;
 
 	public JobThreadRootControllerImpl(RuntimeJobExecution jobExecutionlong rootJobExecutionId) {
 		this. = jobExecution;
 		this. = jobExecution.getJobContext();
 		this. = rootJobExecutionId;
 		this. = jobExecution.getInstanceId();
 		this. = ServicesManagerImpl.getInstance().getJobStatusManagerService();
 		this. = jobExecution.getJobNavigator();
 	}
 
 	public JobThreadRootControllerImpl(RuntimeJobExecution jobExecutionlong rootJobExecutionIdBlockingQueue<PartitionDataWrapperanalyzerQueue) {
 		this(jobExecutionrootJobExecutionId);
 		this. = analyzerQueue;
 	}
 	
 	/*
 	 * By not passing the rootJobExecutionId, we are "orphaning" the subjob execution and making it not findable from the parent.  
 	 * This is exactly what we want for getStepExecutions()... we don't want it to get extraneous entries for the partitions.   
 	 */
 		this(jobExecutionjobExecution.getExecutionId());
 		this. = analyzerQueue;
 	}
 
 		String methodName = "executeJob";
 		.entering(methodName);
 
 		ExecutionStatus retVal = null;
 		try {
 			// Check if we've already gotten the stop() command.
 
				// Now that we're ready to start invoking artifacts, set the status to 'STARTED'
				// --------------------
				// The BIG loop transitioning 
				// within the job !!!
				// --------------------
				ExtendedBatchStatus extBatchStatus = retVal.getExtendedBatchStatus();
				switch (extBatchStatus)  {
					case  : 		jslStop();
											break;
											break;
											break;
				}
			}
catch (Throwable t) {
			// We still want to try to call the afterJob() listener and persist the batch and exit
			// status for the failure in an orderly fashion.  So catch and continue.
			logWarning("Caught throwable in main execution loop"t);
		}
		.exiting(methodName);
		return retVal;
	}
	protected void setContextProperties() {
		JSLProperties jslProps = jobModel.getProperties();
		if (jslProps != null) {
			Properties contextProps = .getProperties();
			for (Property property : jslProps.getPropertyList()) {
				contextProps.setProperty(property.getName(), property.getValue());
			}	
		}
	}
	protected void jslStop() {
		String restartOn = .getRestartOn();	
		.fine("Logging JSL stop(): exitStatus = " + .getExitStatus() + ", restartOn = " +restartOn );
		return;
	}
	protected void markJobStarted() {
		long time = System.currentTimeMillis();
		Timestamp timestamp = new Timestamp(time);
	}
	/*
	 *  Follow similar pattern for end of step in BaseStepControllerImpl
	 *  
	 *  1. Execute the very last artifacts (jobListener)
	 *  2. transition to final batch status
	 *  3. default ExitStatus if necessary
	 *  4. persist statuses and end time data
	 *  
	 *  We don't want to give up on the orderly process of 2,3,4, if we blow up 
	 *  in after job, so catch that and keep on going.
	 */
	protected void endOfJob() {
		// 1. Execute the very last artifacts (jobListener)
		try {
catch (Throwable t) {
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			.warning("Error invoking jobListener.afterJob(). Stack trace: " + sw.toString());
		}
		// 2. transition to final batch status
		// 3. default ExitStatus if necessary
		if (.getExitStatus() == null) {
			.fine("No job-level exitStatus set, defaulting to job batch Status = " + .getBatchStatus());
		}
		// 4. persist statuses and end time data
		.fine("Job complete for job id=" + .getJobInstance().getJobName() + ", executionId=" + .getExecutionId() 
", batchStatus=" + .getBatchStatus() + ", exitStatus=" + .getExitStatus());
	}
	private void persistJobBatchAndExitStatus() {
		// Take a current timestamp for last updated no matter what the status.
		long time = System.currentTimeMillis();
		Timestamp timestamp = new Timestamp(time);
		// Perhaps these should be coordinated in a tran but probably better still would be
		// rethinking the table design to let the database provide us consistently with a single update.
		if (batchStatus.equals(.) || batchStatus.equals(.) ||  
				batchStatus.equals(.)) {
					batchStatus.getExitStatus(), timestamp);
else {
			throw new IllegalStateException("Not expected to encounter batchStatus of " + batchStatus +" at this point.  Aborting.");
		}
	}

The only valid states at this point are STARTED or STOPPING. Shouldn't have been able to get to COMPLETED, STOPPED, or FAILED at this point in the code.
	private void transitionToFinalBatchStatus() {
		BatchStatus currentBatchStatus = .getBatchStatus();
		if (currentBatchStatus.equals(.)) {
else if (currentBatchStatus.equals(.)) {
else if (currentBatchStatus.equals(.)) {
			updateJobBatchStatus(.);  // Should have already been done but maybe better for possible code refactoring to have it here.
else {
			throw new IllegalStateException("Step batch status should not be in a " + currentBatchStatus.name() + " state");
		}
	}
	protected void updateJobBatchStatus(BatchStatus batchStatus) {
		.fine("Setting job batch status to: " + batchStatus);
	}
	protected void logWarning(String msgThrowable t) {
		StringWriter sw = new StringWriter();
		.warning(msg + " with Throwable message: " + t.getMessage() + ", and stack trace: " + sw.toString());
	}
	/*
	 * The thought here is that while we don't persist all the transitions in batch status (given
	 * we plan to persist at the very end), we do persist STOPPING right away, since if we end up
	 * "stuck in STOPPING" we at least will have a record in the database.
	 */
	protected void batchStatusStopping() {
		long time = System.currentTimeMillis();
		Timestamp timestamp = new Timestamp(time);
	}
	private void setupListeners() {
		InjectionReferences injectionRef = new InjectionReferences(nullnull);
		 = new ListenerFactory(jobModelinjectionRef);
	}
	public void stop() {
			if (stoppableElementController != null) {
				stoppableElementController.stop();
			}
else {
			.info("Stop ignored since batch status for job is already set to: " + .getBatchStatus());
		}
	}
	// Call beforeJob() on all the job listeners
	protected void jobListenersBeforeJob() {
		for (JobListenerProxy listenerProxy : jobListeners) {
				.fine("Invoking beforeJob() on jobListener: " + listenerProxy.getDelegate() + " of type: " + listenerProxy.getDelegate().getClass());
			}
			listenerProxy.beforeJob();
		}
	}
	// Call afterJob() on all the job listeners
	private void jobListenersAfterJob() {
		for (JobListenerProxy listenerProxy : jobListeners) {
				.fine(" Invoking afterJob() on jobListener: " + listenerProxy.getDelegate() + " of type: " + listenerProxy.getDelegate().getClass());
			}
			listenerProxy.afterJob();
		}	
	}
	protected void batchStatusFailedFromException() {
	}
    @Override
    public List<LonggetLastRunStepExecutions() {
        
        return this..getStepExecIds();
        
    }
New to GrepCode? Check out our FAQ X