// This can be called after any step @Override protected void sequenceFailed(SocietyCompletionEvent<ExperimentStep, R> evt) { StringBuffer msg = new StringBuffer(); msg.append("Experiment ").append(suiteName).append(" FAILED at step ").append(evt.getStep()); Map<String, Set<R>> reportsMap = evt.getReports(); if (!reportsMap.isEmpty()) { String seperator = " "; msg.append(" because"); for (Map.Entry<String, Set<R>> entry : reportsMap.entrySet()) { String nodeId = entry.getKey(); for (R report : entry.getValue()) { if (!report.isSuccessful()) { msg.append(seperator).append("worker ").append(report.getWorker()); msg.append(" on node ").append(nodeId); msg.append(" said: \"").append(report.getReason()).append("\""); seperator = ", "; } } } } log.shout(msg.toString()); // Submit a request to perform the Shutdown step.... // All bets are off if this will actually complete, because there is some // failure out there // but we do not know what it is. if (hasAttemptedToShutdown) { log.warn("Already Attempted to Shutdown, so doing nothing more"); } else { log.warn("Attempting to shutdown the experiment society by skipping to Shutdown step"); hasAttemptedToShutdown = true; publishNodeRequestStep(ExperimentSteps.SHUTDOWN); } }
@Override @Cougaar.Execute(on = Subscribe.ModType.ADD) public void executeSocietyCompletion(SocietyCompletionEvent<ExperimentStep, R> event) { // Sanity check ExperimentStep eventStep = event.getStep(); ExperimentStep descriptorStep = experimentDescriptor.getStep(); if (!eventStep.equals(descriptorStep)) { log.error("Event has step " + eventStep + " but descriptor has step " + descriptorStep); sequenceFailed(event); return; } if (!event.isSuccessful()) { sequenceFailed(event); return; } experimentDescriptor.doWork(event); long deferMillis = experimentDescriptor.getDeferMillis(); if (deferMillis > 0) { deferSocietyCompletion(event, deferMillis); } else { resumeSocietyCompletion(event); } }