/* * Copyright 2012 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.execapp.event; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import azkaban.executor.ExecutableFlow; import azkaban.executor.ExecutableNode; import azkaban.executor.Status; public abstract class FlowWatcher { private Logger logger; private int execId; private ExecutableFlow flow; private Map<String, BlockingStatus> map = new ConcurrentHashMap<String, BlockingStatus>(); private boolean cancelWatch = false; public FlowWatcher(int execId) { this.execId = execId; } public void setFlow(ExecutableFlow flow) { this.flow = flow; } public void setLogger(Logger logger) { this.logger = logger; } protected Logger getLogger() { return this.logger; } /** * Called to fire events to the JobRunner listeners * * @param jobId */ protected synchronized void handleJobStatusChange(String jobId, Status status) { BlockingStatus block = map.get(jobId); if (block != null) { block.changeStatus(status); } } public int getExecId() { return execId; } public synchronized BlockingStatus getBlockingStatus(String jobId) { if (cancelWatch) { return null; } ExecutableNode node = flow.getExecutableNodePath(jobId); if (node == null) { return null; } BlockingStatus blockingStatus = map.get(jobId); if (blockingStatus == null) { blockingStatus = new BlockingStatus(execId, jobId, node.getStatus()); map.put(jobId, blockingStatus); } return blockingStatus; } public Status peekStatus(String jobId) { ExecutableNode node = flow.getExecutableNodePath(jobId); if (node != null) { return node.getStatus(); } return null; } public synchronized void unblockAllWatches() { logger.info("Unblock all watches on " + execId); cancelWatch = true; for (BlockingStatus status : map.values()) { logger.info("Unblocking " + status.getJobId()); status.changeStatus(Status.SKIPPED); status.unblock(); } logger.info("Successfully unblocked all watches on " + execId); } public boolean isWatchCancelled() { return cancelWatch; } public abstract void stopWatcher(); }