/** * Copyright 2011-2017 Asakusa Framework Team. * * 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.asakusafw.yaess.core; import java.io.IOException; import java.text.MessageFormat; import java.util.Set; /** * Represents an atomic job for YAESS. * @since 0.2.3 * @version 0.5.0 */ public abstract class Job { static final YaessLogger YSLOG = new YaessCoreLogger(Job.class); /** * Executes this job. * @param monitor a progress monitor for this job * @param context current execution context * @throws InterruptedException if this execution is interrupted * @throws IOException if failed to execute this job * @throws IllegalArgumentException if some parameters were {@code null} * @since 0.2.6 */ public final void launch( ExecutionMonitor monitor, ExecutionContext context) throws InterruptedException, IOException { if (monitor == null) { throw new IllegalArgumentException("monitor must not be null"); //$NON-NLS-1$ } if (context == null) { throw new IllegalArgumentException("context must not be null"); //$NON-NLS-1$ } YSLOG.info("I04000", context.getBatchId(), context.getFlowId(), context.getExecutionId(), context.getPhase(), getJobLabel(), getServiceLabel(), getTrackingId(context)); long start = System.currentTimeMillis(); try { execute(monitor, context); YSLOG.info("I04001", context.getBatchId(), context.getFlowId(), context.getExecutionId(), context.getPhase(), getJobLabel(), getServiceLabel(), getTrackingId(context)); } catch (IOException e) { YSLOG.error(e, "E04001", context.getBatchId(), context.getFlowId(), context.getExecutionId(), context.getPhase(), getJobLabel(), getServiceLabel(), getTrackingId(context)); throw e; } catch (InterruptedException e) { YSLOG.warn(e, "W04001", context.getBatchId(), context.getFlowId(), context.getExecutionId(), context.getPhase(), getJobLabel(), getServiceLabel(), getTrackingId(context)); throw e; } finally { long end = System.currentTimeMillis(); YSLOG.info("I04999", context.getBatchId(), context.getFlowId(), context.getExecutionId(), context.getPhase(), getJobLabel(), getServiceLabel(), getTrackingId(context), end - start); } } /** * Executes this job. * @param monitor a progress monitor for this job * @param context current execution context * @throws InterruptedException if this execution is interrupted * @throws IOException if failed to execute this job */ protected abstract void execute( ExecutionMonitor monitor, ExecutionContext context) throws InterruptedException, IOException; /** * Returns the target job label. * @return the target job label */ public abstract String getJobLabel(); /** * Returns the service label which actually executes this job. * @return the service label */ public abstract String getServiceLabel(); /** * Returns the ID of this job for other succeeding jobs. * @return ID of this job */ public abstract String getId(); /** * Returns the tracking ID of this job. * @param context current execution context * @return the tracking ID * @since 0.5.0 */ public String getTrackingId(ExecutionContext context) { return computeTrackingId(context); } /** * Computes the tracking ID. * @param context target context * @param script target script * @return the operation ID * @since 0.5.0 */ public static String computeTrackingId(ExecutionContext context, ExecutionScript script) { return MessageFormat.format( "YAESS/{0}/{1}/{2}/{3}/{4}", context.getBatchId(), context.getFlowId(), context.getPhase(), context.getExecutionId(), script.getId()); } /** * Computes the tracking ID for script-less job. * @param context target context * @return the operation ID * @since 0.5.0 */ public static String computeTrackingId(ExecutionContext context) { return MessageFormat.format( "YAESS/{0}/{1}/{2}/{3}", context.getBatchId(), context.getFlowId(), context.getPhase(), context.getExecutionId()); } /** * Returns job IDs which blocks executing this job. * Any schedulers can execute this job only if all blocker jobs are completed. * @return the blocker job IDs */ public abstract Set<String> getBlockerIds(); /** * Returns the resource ID which this job requires in execution. * @param context current execution context * @return the resource ID required in this job * @throws InterruptedException if this execution is interrupted * @throws IOException if failed to execute this job */ public abstract String getResourceId(ExecutionContext context) throws InterruptedException, IOException; }