/** * Remove the specified pending retry job from the cache * * @param owningProcess * Owning process identifier as returned by * {@link DispatchJobEvent#getOwningProcess()} * @param index * Index of the job as returned by * {@link DispatchJobEvent#getIndex()} */ protected void forget(String owningProcess, int[] index) { for (JobState jobState : getJobsCopy(owningProcess)) if (identicalIndex(jobState.jobEvent.getIndex(), index)) { removeJob(owningProcess, jobState); return; } // It could be due to pipelining activities like BioMart logger.debug("Could not forget " + owningProcess + " " + Arrays.toString(index)); }
@Override public boolean handleError() { currentActivityIndex++; if (currentActivityIndex == jobEvent.getActivities().size()) return false; List<Activity<?>> newActivityList = new ArrayList<>(); newActivityList.add(jobEvent.getActivities().get( currentActivityIndex)); getBelow().receiveJob( new DispatchJobEvent(jobEvent.getOwningProcess(), jobEvent .getIndex(), jobEvent.getContext(), jobEvent .getData(), newActivityList)); return true; } }
@Override public void fail(String message, Throwable t, DispatchErrorType errorType) { logger.warn("Failed (" + errorType + ") invoking " + activity + " for job " + jobEvent + ": " + message, t); monMan.deregisterNode( invocationProcessIdentifier); getAbove().receiveError( new DispatchErrorEvent(jobEvent.getOwningProcess(), jobEvent.getIndex(), jobEvent.getContext(), message, t, errorType, activity)); }
/** * Receive a job from the layer above, store it in the state map then relay * it to the layer below with a modified activity list containing only the * activity at index 0 */ @Override public void receiveJob(DispatchJobEvent jobEvent) { addJobToStateList(jobEvent); List<Activity<?>> newActivityList = new ArrayList<>(); newActivityList.add(jobEvent.getActivities().get(0)); getBelow().receiveJob( new DispatchJobEvent(jobEvent.getOwningProcess(), jobEvent .getIndex(), jobEvent.getContext(), jobEvent.getData(), newActivityList)); }
/** * If an error occurs we can either handle the error or send it to the layer * above for further processing. */ @Override public void receiveError(DispatchErrorEvent errorEvent) { String owningProcess = errorEvent.getOwningProcess(); for (JobState rs : getJobsCopy(owningProcess)) if (identicalIndex(rs.jobEvent.getIndex(), errorEvent.getIndex())) { boolean handled = rs.handleError(); if (!handled) { removeJob(owningProcess, rs); getAbove().receiveError(errorEvent); return; } } }
iterationProvItem = new IterationProvenanceItem(); iterationProvItem.setWorkflowId(parentDataflowId); iterationProvItem.setIteration(jobEvent.getIndex()); iterationProvItem.setIdentifier(uuid()); inputIndexOwnerList.add(jobEvent.getIndex()); inputIndexOwnerList.add(jobEvent.getOwningProcess()); inputDataProvenanceItemMap.put(inputDataItem, inputIndexOwnerList); iterationProvItem.setIteration(jobEvent.getIndex()); iterationProvItem.setProcessId(jobEvent.getOwningProcess()); List<Object> activityIndexOwnerList = new ArrayList<>(); activityIndexOwnerList.add(jobEvent.getOwningProcess()); activityIndexOwnerList.add(jobEvent.getIndex()); activityProvenanceItemMap.put(activityProvItem, inputIndexOwnerList); indexStr(jobEvent.getIndex()), iterationProvItem); iterationProvItem.setEnactmentStarted(new Timestamp(currentTimeMillis())); getReporter().addProvenanceItem(iterationProvItem);