in src/main/java/com/amazonaws/services/simpleworkflow/flow/worker/AsyncDecider.java [453:503]
public void decide() throws Exception {
try {
try {
definition = workflowDefinitionFactory.getWorkflowDefinition(context);
} catch (Exception e) {
throw new Error("Failed to get workflow definition for " + context, e);
}
if (definition == null) {
throw new IllegalStateException("Null workflow definition returned for: " + context.getWorkflowContext().getWorkflowType());
}
decideImpl();
}
catch (AmazonServiceException e) {
// We don't want to fail workflow on service exceptions like 500 or throttling
// Throwing from here drops decision task which is OK as it is rescheduled after its StartToClose timeout.
if (e.getErrorType() == ErrorType.Client && !"ThrottlingException".equals(e.getErrorCode())) {
if (log.isErrorEnabled()) {
log.error("Failing workflow " + workflowContext.getWorkflowExecution(), e);
}
decisionsHelper.failWorkflowDueToUnexpectedError(e);
}
else {
throw e;
}
} catch (Error e) {
// Do not fail workflow on Error. Fail the decision.
throw e;
}
catch (Throwable e) {
if (log.isErrorEnabled()) {
log.error("Failing workflow " + workflowContext.getWorkflowExecution(), e);
}
decisionsHelper.failWorkflowDueToUnexpectedError(e);
}
finally {
try {
if (definition != null) {
decisionsHelper.setWorkflowContextData(definition.getWorkflowState());
}
}
catch (WorkflowException e) {
decisionsHelper.setWorkflowContextData(e.getDetails());
}
catch (Throwable e) {
decisionsHelper.setWorkflowContextData(e.getMessage());
}
if (definition != null) {
workflowDefinitionFactory.deleteWorkflowDefinition(definition);
}
}
}