/* * Copyright 2014 LinkedIn Corp. * * 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 azkaban.executor; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import azkaban.flow.CommonJobProperties; import azkaban.jobExecutor.AbstractProcessJob; import azkaban.utils.Props; public class InteractiveTestJob extends AbstractProcessJob { private static ConcurrentHashMap<String, InteractiveTestJob> testJobs = new ConcurrentHashMap<String, InteractiveTestJob>(); private Props generatedProperties = new Props(); private boolean isWaiting = true; private boolean succeed = true; public static InteractiveTestJob getTestJob(String name) { return testJobs.get(name); } public static void clearTestJobs() { testJobs.clear(); } public InteractiveTestJob(String jobId, Props sysProps, Props jobProps, Logger log) { super(jobId, sysProps, jobProps, log); } @Override public void run() throws Exception { String nestedFlowPath = this.getJobProps().get(CommonJobProperties.NESTED_FLOW_PATH); String groupName = this.getJobProps().getString("group", null); String id = nestedFlowPath == null ? this.getId() : nestedFlowPath; if (groupName != null) { id = groupName + ":" + id; } testJobs.put(id, this); while (isWaiting) { synchronized (this) { try { wait(30000); } catch (InterruptedException e) { } if (!isWaiting) { if (!succeed) { throw new RuntimeException("Forced failure of " + getId()); } else { info("Job " + getId() + " succeeded."); } } } } } public void failJob() { synchronized (this) { succeed = false; isWaiting = false; this.notify(); } } public void succeedJob() { synchronized (this) { succeed = true; isWaiting = false; this.notify(); } } public void succeedJob(Props generatedProperties) { synchronized (this) { this.generatedProperties = generatedProperties; succeed = true; isWaiting = false; this.notify(); } } @Override public Props getJobGeneratedProperties() { return generatedProperties; } @Override public void cancel() throws InterruptedException { info("Killing job"); failJob(); } }