blob: 096e78fa3f23b01bca6ac98e627d469a459e6bc4 [file] [log] [blame]
/**
* 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 org.apache.batchee.container.util;
import org.apache.batchee.container.ThreadRootController;
import org.apache.batchee.container.exception.BatchContainerRuntimeException;
import org.apache.batchee.container.impl.controller.JobController;
import org.apache.batchee.container.impl.jobinstance.RuntimeJobExecution;
import org.apache.batchee.container.services.BatchKernelService;
import org.apache.batchee.container.services.ServicesManager;
import javax.batch.runtime.BatchStatus;
import java.io.PrintWriter;
import java.io.StringWriter;
/*
* I took out the 'work type' constant since I don't see that we want to use
* the same thread pool for start requests as we'd use for stop requests.
* The stop seems like it should be synchronous from the JobOperator's
* perspective, as it returns a 'success' boolean.
*/
public class BatchWorkUnit implements Runnable {
protected RuntimeJobExecution jobExecutionImpl = null;
protected BatchKernelService batchKernel = null;
protected ThreadRootController controller;
protected boolean notifyCallbackWhenDone;
public BatchWorkUnit(final ServicesManager manager, final RuntimeJobExecution jobExecutionImpl) {
this(manager, jobExecutionImpl, true);
}
public BatchWorkUnit(final ServicesManager manager, final RuntimeJobExecution jobExecutionImpl,
final boolean notifyCallbackWhenDone) {
this.setBatchKernel(manager.service(BatchKernelService.class));
this.setJobExecutionImpl(jobExecutionImpl);
this.setNotifyCallbackWhenDone(notifyCallbackWhenDone);
this.controller = new JobController(jobExecutionImpl, manager);
}
public ThreadRootController getController() {
return this.controller;
}
@Override
public void run() {
try {
controller.originateExecutionOnThread();
if (isNotifyCallbackWhenDone()) {
getBatchKernel().jobExecutionDone(getJobExecutionImpl());
}
} catch (final Throwable t) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
if (isNotifyCallbackWhenDone()) {
getBatchKernel().jobExecutionDone(getJobExecutionImpl());
}
throw new BatchContainerRuntimeException("This job failed unexpectedly.", t);
} finally {
// Put this in finally to minimize chance of tying up threads.
markThreadCompleted();
}
}
protected BatchStatus getBatchStatus() {
return jobExecutionImpl.getJobContext().getBatchStatus();
}
protected String getExitStatus() {
return jobExecutionImpl.getJobContext().getExitStatus();
}
public void setBatchKernel(BatchKernelService batchKernel) {
this.batchKernel = batchKernel;
}
public BatchKernelService getBatchKernel() {
return batchKernel;
}
public void setJobExecutionImpl(RuntimeJobExecution jobExecutionImpl) {
this.jobExecutionImpl = jobExecutionImpl;
}
public RuntimeJobExecution getJobExecutionImpl() {
return jobExecutionImpl;
}
public void setNotifyCallbackWhenDone(boolean notifyCallbackWhenDone) {
this.notifyCallbackWhenDone = notifyCallbackWhenDone;
}
public boolean isNotifyCallbackWhenDone() {
return notifyCallbackWhenDone;
}
protected void markThreadCompleted() {
// No-op
}
}