diff --git a/build.gradle b/build.gradle index 8b3c42d4e4..64d00d4c5e 100644 --- a/build.gradle +++ b/build.gradle @@ -76,7 +76,7 @@ buildscript { ext.dependency_checker_version = '3.1.0' ext.commons_collections_version = '4.1' ext.beanutils_version = '1.9.3' - ext.crash_version = 'cce5a00f114343c1145c1d7756e1dd6df3ea984e' + ext.crash_version = 'cadb53544fbb3c0fb901445da614998a6a419488' ext.jsr305_version = constants.getProperty("jsr305Version") ext.spring_jdbc_version ='5.0.0.RELEASE' ext.shiro_version = '1.4.0' diff --git a/docs/source/api-flows.rst b/docs/source/api-flows.rst index eebd1054e9..6e80c7ae72 100644 --- a/docs/source/api-flows.rst +++ b/docs/source/api-flows.rst @@ -688,6 +688,9 @@ HTTP and database calls HTTP, database and other calls to external resources are allowed in flows. However, their support is currently limited: * The call must be executed in a BLOCKING way. Flows don't currently support suspending to await the response to a call to an external resource + + * For this reason, the call should be provided with a timeout to prevent the flow from suspending forever. If the timeout elapses, this should be treated as a soft failure and handled by the flow's business logic + * The call must be idempotent. If the flow fails and has to restart from a checkpoint, the call will also be replayed Concurrency, Locking and Waiting diff --git a/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java b/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java index 934f35219d..4934a9a4dd 100644 --- a/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java +++ b/tools/shell/src/main/java/net/corda/tools/shell/RunShellCommand.java @@ -46,8 +46,10 @@ public class RunShellCommand extends InteractiveShellCommand { private void emitHelp(InvocationContext context, StringToMethodCallParser parser) { // Sends data down the pipeline about what commands are available. CRaSH will render it nicely. // Each element we emit is a map of column -> content. - Map cmdsAndArgs = parser.getAvailableCommands(); - for (Map.Entry entry : cmdsAndArgs.entrySet()) { + Set> entries = parser.getAvailableCommands().entrySet(); + ArrayList> entryList = new ArrayList<>(entries); + entryList.sort(Comparator.comparing(Map.Entry::getKey)); + for (Map.Entry entry : entryList) { // Skip these entries as they aren't really interesting for the user. if (entry.getKey().equals("startFlowDynamic")) continue; if (entry.getKey().equals("getProtocolVersion")) continue;